2014-03-30 62 views
1

基本問題是這樣的:我有一個項目已經爲各種子項目使用了多個Maven模塊。但是,其中一個模塊(核心模塊)在創建時可以自行拆分爲多個OSGi包。這是由於核心模塊包含幾個可選的依賴關係,每個依賴關係在需要的地方都有獨立的Java包。例如,對JSON輸入文件的支持是可選的,因爲它們需要Jackson的可選依賴項。依賴於Jackson依賴的類都被隔離到模塊內的某些json包。因此,從理論上講,我可以從核心創建一個最小包,它不包含依賴可選依賴項的包。如何從單個Maven項目生成多個OSGi包?

通常情況下,我會簡單地將此模塊分解爲更多的Maven模塊,以便通過Felix的maven-bundle-plugin輕鬆創建包。這裏的問題是,我仍然想爲非OSGi用戶創建一個核心JAR,這些用戶不想爲了使用可選功能而需要包含幾個額外的JAR(這要求他們提供類路徑上的可選依賴項,因爲它是)。不僅如此,我也不希望將這個模塊分解成更多的模塊,因爲它使開發人員對項目的開發更加乏味,特別是當我們已經將代碼分解到適當的基於軟件包的模塊時就這樣。

我們試圖使用OSGi的方式是讓API模塊成爲一個片段主機(爲了允許它在不需要OSGi支持的情況下加載提供者包),然後讓其他包使用所述片段主機。對於核心外的較小模塊,這看起來效果很好,但對於核心,我們希望能夠從單個模塊提供多個bundle,以便bundle中不需要可選依賴項。就現在而言,對於插件,我們已經有了一個機制來掃描它們,並忽略沒有所有必需的類來加載它們的插件(例如,如果插件需要JPA提供程序但JPA API不可用,那個插件未加載)。一旦我們可以成功地將核心模塊拆分爲多個bundle,我可以在OSGi環境中使用聲明式服務作爲插件方法(而不是用於普通Java環境的默認類路徑JAR掃描機制),所以這不是問題。

有什麼辦法可以使用Felix的maven-bundle-plugin來完成所有這些工作嗎?或者我將不得不使用程序集插件來複制可以生成包的模塊的子集?或者我將不得不求助於編寫Ant腳本(或Maven插件)來執行此操作?我們已經嘗試過使用單獨的Maven模塊,它們只是將核心模塊作爲依賴項導入並從那裏生成一個包,但不管導入/導出包的設置和嵌入依賴關係如何,結果包總是空的。

或者,有沒有更好的方法來做到這一點?我們已經將<optional>true</optional>配置用於可選的依賴關係,但Felix插件似乎並不關心這一點,並且無需使用可選屬性就可以導入所有這些依賴關係。

+0

實際上,您無法使用Maven爲每個項目構建多個工件。這不僅僅是Maven的工作方式,而且你會以整體的方式對抗它。另外,您使用可選軟件包導入的方式聽起來很奇怪且不必要;你可能想更詳細地描述這個動機,以便找到更好的解決方案。 –

+0

可選的依賴關係用於在啓動時按需加載的某些插件。如果插件缺少依賴關係,則該插件不會添加到可用插件列表中。如果它有幫助,那麼這個項目就是Log4j版本2。 – Matt

回答

2

嗯,這就是我最終要做的。我使用maven-assembly-plugin來複制我需要的二進制文件,並使用類似於<fileset/>元素的<fileSets/>元素過濾出我不想包含的類。

爲每個程序集使用生成的目錄,我使用maven-bundle-plugin以及<buildDirectory/>配置選項來指定程序包的類文件所在的位置。

這並不理想,但它比爲Maven項目編寫Ant腳本要好!

相關問題