2014-01-11 32 views
1

我正在使用第三方代碼,它使用了一些jar(實際上,這是log4j)。當運行我的插件時,我得到了多個錯誤ClassNotFoundException,NoClassDefFoundError。由於第三方代碼的使用僅限於ViewPart,程序正在運行,但未實例化視圖。如何將常規jar添加到插件(ClassNotFoundException,NoClassDefFoundError)?

在Eclipse的編譯時間,我像往常一樣將所需的jar添加到類路徑中,並且在編譯時代碼沒有任何錯誤,包括import指令log4j

因爲我把所有的(許多)需要的jar到lib子目錄我的項目目錄,我想修改build.properties如下

source.. = src/ 
output.. = bin/ 
bin.includes = plugin.xml,\ 
       META-INF/,\ 
       lib/,\ 
       . 

但顯然這並沒有幫助。

我在哪裏可以看到我的整個捆綁包/插件編譯打包以檢查包含哪些罐子?

UPDATE

目前我把需要的jar兩次。

第一個 - 到正常的Ec​​lipse Configure Build Path窗口:

enter image description here

第二個 - 到plugin.xml編輯Runtime標籤的Classpath部分:

enter image description here

後者的配置使得在build.properties文件中更改:

source.. = src/ 
output.. = bin/ 
bin.includes = plugin.xml,\ 
       META-INF/,\ 
       lib/,\ 
       .,\ 
       lib/java-getopt-1.0.13.jar,\ 
       lib/jsp-api-2.0.jar,\ 
       lib/junit-4.11.jar,\ 
       lib/log4j-1.2.17.jar,\ 
       lib/rhino-1.7R4.jar,\ 
       lib/servlet-api-6.0.36.jar,\ 
       lib/tomcat-catalina-7.0.42.jar,\ 
       lib/commons-logging-1.1.3.jar,\ 
       lib/spring-beans-3.2.0.RELEASE.jar,\ 
       lib/spring-core-3.2.0.RELEASE.jar,\ 
       lib/miglayout-core-4.2.jar,\ 
       lib/miglayout-swt-4.2.jar,\ 
       conf/ 

那麼有可能AUTOMATE這個怎麼樣?是否有可能AUTOMATICALLY將所有常規類路徑條目傳遞給運行時?

我需要簡化,我不想將jar包成bundle和類似的東西。

問題是開放的。

回答

4

要導出插件,您可以使用文件菜單 - >導出 - >插件開發/可部署插件和片段。然後選擇你的插件,它將作爲一個罐子出口。要導出產品,請在.product文件中有一個產品導出選項。

我建議您使用「新建項目」嚮導中的「現有JAR歸檔插件」選項創建單獨的插件。如果是這樣,那麼我希望你不要忘記把它包含到你的運行配置中。此外,請檢查this question瞭解更多詳情。

更新: 你既不需要,也不強迫你的罐子轉換成束,但由於你沒有創建一個純Java項目(你有一個OSGi包,有自己的類加載器和生命週期),你可能想要考慮一些最佳實踐/規則,這可以幫助您創建一個好的插件/項目。

爲什麼需要將依賴項轉換爲捆綁包?

您已經有了第三方的依賴性(log4j的,阿帕奇百科全書 收藏等)的罐子和所有你需要做的就是把它添加到您的 bundle的classpath。這很簡單,只要你開發一個軟件包或者你的軟件包不共享公共的 依賴項,只要你是 。

但是,實際上,您可能會創建一堆軟件包,並且它們都會使用常見的依賴關係。這裏的問題是OSGi 類加載工作的方式。每個bundle都有它自己的類加載器,所以如果你有兩個在他們的 類路徑中使用log4j作爲jar依賴的兩個bundle,並且當你試圖在每個bundle中引用log4j時,每個嘗試創建他們自己的log4j類的實例在 其各自的類加載器。這可能會導致類加載器約束 違規問題或ClassCastExceptions。如果您將這些 依賴項轉換爲OSGi包,那麼將不再發生這些問題 。這是因爲現在每個依賴關係(如log4j)都有它自己的類加載器,因此無論何時你的Bundle A或Bundle B想要加載log4j類,它都會從log4j bundle classloader加載它。

欲瞭解更多信息請參閱this article

關於自動化過程:我不認爲這是可能的。由於您手動將jar添加到lib文件夾中,因此應手動將它們添加到類路徑中(在Runtime部分中)。但是,在build.includes配置中定義lib/應該有所幫助。另外,可能是this會有幫助。請注意,你的不需要像往常一樣「添加jar來建立路徑」!將其添加到Runtime部分(您的第二個屏幕截圖)中,將其添加到構建路徑中。

此外,請注意,在您的屏幕截圖上"."不在Runtime配置部分的頂部。

+0

我沒有'產品'呢。另外我不明白爲什麼要先打包成捆?我正在編寫Java,爲什麼我不能使用jar呢? –

+0

請參閱更新的答案。 –

+0

感謝爲罐子製作單獨的包的理由,但我已經有一些已經制作好的代碼,並且想要將其包裝進去。它具有正常的傳統依賴關係。這些依賴於外部罐子和整個外部項目。 Eclipse允許在插件項目中同時添加。但我不明白爲什麼Eclipse(1)允許他們和(2)忽略它們。如果Eclipse不允許輸入或使用它,那將會很棒。沒有意義可以使用未使用的功能。 –

2
  1. log4j作爲OSGi軟件包提供:http://ebr.springsource.com/repository/app/bundle/detail;jsessionid=66ADD0FE737BA9A5DD36A052F4A6809A.jvm1?name=com.springsource.org.apache.log4j。一般來說,如果你想使用未發佈爲OSGi bundle(還)的第三方庫,那麼檢查SpringSource是否有OSGi版本是值得的。就像亞歷山大加夫裏洛夫所說的那樣,如果不是的話,那麼你可以wrap it as a bundle yourself

  2. 最後,如果你真的想把它作爲一個非OSGi包,你需要在你的MANIFEST.MF中設置Bundle-ClassPath: ., lib/log4j.jar。當然,這需要爲每個需要jar的插件,每個jar以及Eclipse中的構建路徑進行更改。

一些更相關的問題和鏈接:https://stackoverflow.com/questions/5150415/log4j-under-osgi-eclipse-rcphttps://stackoverflow.com/questions/11341627/integrating-3rd-party-jars-into-eclipse-rcphttps://stackoverflow.com/questions/6545212/add-3rd-party-library-to-an-eclipse-plugin

我需要SIMPLIFICATION,我不想將jar包成bundle和類似的東西。

捆綁罐子在MANIFEST.MF一些額外的信息,僅此而已。 OSGi(因此Eclipse)確實需要這些信息。最常用的庫或者已經捆綁了(只需在MANIFEST.MF中檢查Bundle-SymbolicName),或者作爲捆綁包提供。否則,只需爲每個jar包裝一個jar包,而不必爲每個依賴於jar的插件更改構建路徑,即build.propertiesBundle-ClassPath

+0

我不明白,爲什麼它啓用了Eclipse標準的方式添加jar呢?以後只是忽略它? –

+1

可能因爲沒有簡單的方法來禁用它。 –

相關問題