2012-09-24 57 views
8

我創建了一個Eclipse 4應用程序,我需要一個jar作爲我的應用程序的一部分提供功能(這可以是任何東西,例如log4j以使其變得微不足道)。
我添加了jar作爲我項目類路徑(Right Click->Configure Build Path)的一部分,但在運行時我的服務失敗,出現ClassNotFound錯誤(來自OSGI,我猜?)。
無論如何搜索這個結果,至少據我瞭解,我應該添加jar作爲另一個Plugin的一部分,並創建從我的應用程序/服務到這個新插件的依賴項。
I.e.我創建了一個Plugin Project from Existing JAR archives
這一次設置工作。
所以,如果我明白這一點,當爲Eclipse/OSGi開發時,我們不應該直接在類路徑中添加jars,而是通過插件添加它們(爲什麼?)。
問題:如果我到目前爲止是正確的,那麼在開發項目時包含jars的標準做法是什麼?
定義/創建一個Plugin Project from existing JAR archives並添加所有所需的第三方那裏需要的庫,有每一個不同的插件項目所需jar別的東西或許???
對不起,如果我的術語不準確。我是OSGi和Eclipse編程中的新手如何從eclipse/osgi應用程序中將依賴項包含到jar文件中?

說明:在談到jars時,我並不指向其他OSGi服務。我指的是使用準備好,可靠的第三方庫的規範,這是許多應用程序所需要的。例如。 log4j或xml解析庫或apache commons

+0

什麼是你的終極目標是:你想創建「您的」項目交付,說一個jar/zip包含所有需要的類/ jar /資源來運行你的程序? – Kashyap

+0

@thekashyap:不知道我理解你的問題。導出的產品是由'.product'配置預定義的,對嗎?所以我擔心如何設置項目,以便在部署中我知道所有必需的罐子都可用。 – Cratylus

+0

查看:http://www.vogella.com/articles/OSGi/article.html和http://www.coderanch.com/t/104274/vc/Order-Export-tab-Java-Build – Kashyap

回答

3

您提到的示例可用作OSGi包,因此您無需自己將它們捆綁在一起。您通常不使用OSGi中的直接jar依賴項,通常使用包或包依賴項。在您提到的log4j示例中,您應該使用導入包,因爲可以有多個捆綁包提供程序(較新的log4j jar,springource捆綁版本的較舊的log4j,slf4j實現...)。這會將您的代碼依賴關係從實際提供者中斷開。

這些依賴關係通過您的清單維護,而不是您的項目類路徑。在eclipse插件項目中,項目構建類路徑是從清單中的條目派生的。

即使您沒有使用服務,所有代碼依賴關係仍然通過清單維護。

+0

但是,如果我使用'import package',這意味着'jar'在部署權的'OSGi'容器中的某處,那麼我怎麼知道哪些jar已經可用?我怎麼知道'log4j'已經提供了?我將如何使用'apache commons'?這是否也包含在內?這怎麼可能? – Cratylus

+0

另外我的意思是有些情況下,我需要一些沒有作爲捆綁包提供的jar,對吧? – Cratylus

+0

爲應用程序部署捆綁軟件是特定於實現的。在eclipse中,您的目標平臺確定可用的捆綁包。至於非捆綁的罐子,你可以通過創建一個新的插件項目形式現有的jar來簡單地爲他們創建捆綁包。你也可以將它包含在捆綁中,但我更喜歡捆綁方式。 – Robin

5

對於運行時,它始終是Manifest和那裏的頭文件,用於控制bundle classpath中的內容。有三種方法可以訪問jar:

  1. 導入包頭。這是推薦的方式。您爲每個需要的軟件包定義一個導入。您想要訪問的jar必須作爲一個包在運行時部署。它還需要導出所有需要的軟件包。

  2. Require-Bundle。這是訪問包的另一種方式。您可以定義您需要的軟件包的ID並查看它導出的所有軟件包。由於Require-Bundle將你更緊密地綁定到另一個bundle,所以Import-Package方式應該是首選。

  3. Bundle-Classpath。這允許將jar添加到您嵌入到您自己的包中的類路徑中。當另一種方式不起作用時,這應該是最後的手段。將其與其他方法混合使用時,您可能會遇到討厭的類加載問題。

您可以在maven中心找到許多預建包。今天的許多罐子已經包含OSGi清單。對於這種情況並非如此,許多罐子被servicemix重新打包爲捆綁包。請參閱groupId:org.apache.servicemix.bundles。還有春季束庫,你可以找到更多。

下面我列出你可能想讀一些資源:

http://www.aqute.biz/Blog/2007-02-19

http://wiki.osgi.org/wiki/Import-Package

http://wiki.osgi.org/wiki/Require-Bundle

http://www.vogella.com/blog/2009/03/27/required-bundle-import-package/

+0

For case( 1)如果我需要爲需要的罐子創建一個捆綁包,我應該把所有需要的罐子放在這個捆綁包中(如果我需要多個罐子)**或**每個罐子應該放在每個捆綁包中? – Cratylus

+0

我認爲從罐子製作捆綁包的最好方法就是添加Manifest條目。所以每個jar都將是它自己的包。這有一個優點,就是你的maven depdendency結構與bundle相匹配。順便說一句。如果你必須創建bundle,請查看bnd和maven bundle插件。 –

3

我們面對我們的項目Extactaly同樣的問題。 我們有一些與OSGi不兼容的遺留JAR,我們創建了與BundleContent平行的lib文件夾並將其添加到清單的classpath部分。

Bundle-ClassPath: ., 

/lib/<legacy jar>.jar 

沒有必要對出口和不必要的,如果只有一個包會消耗它包進口,

+2

+1此捆綁包的內容增加了一個無法承受的開銷,特別是在並行開發JAR和Eclipse插件時。令人討厭的是,在每一次迭代中,它都會消耗時間,從而啓動流程......我**非常憎恨Eclipse **,因爲它避開了插件開發過程中的Maven。是的,有Tycho,但我寧願用我剛斷開的手臂拍我自己的頭,我只是咬我自己的肩膀,直到我感覺舒服,而不是使用爲Eclipse插件傳統設計的那種神祕的,無證的樂隊援助JAR依賴用法。敏捷,不! – ppeterka

相關問題