2012-08-09 54 views
2

在classpath中查找一個資源後,我得到了這個網址:OSGi/Equinox:如何將資源URI轉換爲包名稱?

bundleresource://23.fwk1186515174/com/google/inject/Injector.class 

我怎樣才能找出其中包提供的資源?

[編輯]我想調試一個問題,我有類路徑上重複的類。下面是我使用的代碼:這給了我幾個網址,com.google.inject.Injector

private void debugClassPath() { 
    String resource = "com/google/inject/Injector.class"; 
    try { 
     Enumeration<URL> urls = getClass().getClassLoader().getResources(resource); 

     while(urls.hasMoreElements()) { 
      System.out.println(urls.nextElement()); 
     } 

     System.out.println("---"); 

     urls = XtextRunner.class.getClassLoader().getResources(resource); 

     while(urls.hasMoreElements()) { 
      System.out.println(urls.nextElement()); 
     } 
    } catch(IOException e) { 
     e.printStackTrace(); 
    } 
} 

,我想弄清楚哪些捆綁它們添加到classpath中。

回答

0

OSGi網址保證了層次結構。因此,只需將com/google/inject/Injector.class替換爲META-INF/MANIFEST.MF並將資源讀取爲清單(或文本文件)。那裏的信息告訴你你正在看哪個包。

重複類只能發生在拆分包被認爲是不好(非常糟糕)的做法。在OSGi中,拆分包需要Require-Bundle再轉出或Bundle-Classpath。沒有這些,生活變得容易很多...

+0

你有沒有解釋什麼是「拆分包裝」的文件,以及如何「修復」它們?背景:我需要足夠的信息/對問題的理解來告訴涉及如何解決問題的項目。 – 2012-08-13 07:39:52

+0

開始使用bnd(tools)... bnd驗證程序,並在您拆分軟件包時向您大叫。拆分包是同一個包中的多個提供者。在OSGi中,只有在使用Require-Bundle進行重新導出時纔會發生這種情況。停止這樣做,你的問題就結束了。 拆分包在模塊層的規範中討論。 – 2012-08-13 07:54:09

+0

我沒有這樣做;它必須在另外兩個項目中,所以我需要說服這兩個項目來解決它。 – 2012-08-13 07:56:06

0

一個不好的方法是解析URL,但這隻會在Equinox上運行時才起作用。根據BundleResourceHandler的來源,URL方案右側的整數('23')是包ID。如果你有一個BundleContext(檢查你的Activator),那麼你可以使用getBundle(long)找到這個包含該ID的包。

但是,這樣做可能有更好的方法。你如何查找類路徑上的資源?

+0

通常的方法:getClass()。getClassLoader()。getResources('com/google/inject/Injector.class')'。我試圖調試一個類加載問題,我得到這個資源的*兩個* URL,我想知道哪些bundle提供了它們。 – 2012-08-10 08:08:55

+0

假設一個包加載一個類的版本,另一個加載另一個版本?您可以嘗試增加Equinox容器中的日誌記錄以查看所使用的類加載接線。按照http://help.eclipse.org/galileo/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/misc/runtime-options中的'osgi.debug'所述創建.options文件.html和include'org.eclipse.osgi/resolver/wiring = true'(還有其他選項) – 2012-08-10 09:50:04

+0

我認爲我的bundle的兩個依賴關係導出了同一個類,但我需要知道哪些依賴關係。 – 2012-08-10 12:14:54

0

沒有標準的方法來做到這一點。但是,對於Equinox,通過查看URL處理程序如何在權威機構中對其進行編碼,有一種實現特定的方式(在將來的版本中可能會發生變化,因爲它是一種實現特定的方式)。

+0

這是Equinox/Eclipse特定的。我怎樣才能在Equinox中做到這一點? – 2012-08-10 08:11:13