2013-03-31 64 views
3

我有一個maven multimodule項目,有一個父項目和一堆模塊。其中一個模塊是「主模塊」,其中包含所有庫。所有其他模塊都依賴於該模塊並使用提供的庫。所有模塊的Maven燈罩重新定位?

主模塊是一個Bukkit插件,可以將其他模塊作爲擴展加載。這些擴展都用它們自己的類加載器加載,但加載的類在加載器之間共享以便能夠相互依賴。他們也可以依賴其他Bukkit插件,因爲他們的父類加載器是Bukkit的PluginClassLoader,它也共享插件之間的加載類以允許交互。

這就是問題出現的地方:不同的插件可能會使用同一個庫,但該庫的類可能會被不同的類加載器加載,從而導致LinkageErrors和其他問題。

我的想法是通過maven-shade-plugin重新定位主模塊中的庫。只有主模塊使用的庫才能正常工作。但是,重定位其他模塊使用的庫會導致運行時ClassNotFoundExceptions,因爲這些模塊仍在搜索正常的包名稱而不是重定位的包名稱。 然後我試圖改變導入到重定位的包,但我的IDE(IntelliJ)沒有找到類。

有沒有人有關於如何解決這個搬遷問題的想法?或者可能在類加載問題上採用不同的方法?

回答

1

我幾乎完全相同的問題,你已經有(從這個問題的年齡來判斷)。雖然我沒有一個更清潔的解決方案來覆蓋其他插件的版本,但我確實有一個解決方法,讓IntelliJ無法識別重定位的類。

爲了防止抱怨,我將帶陰影的jar(重定位)作爲IntelliJ庫添加到目標模塊。 你可以做到這一點,像這樣:

  1. 轉到File > Project Structure... > Modules > (target module) > Dependencies
  2. 選擇使用Add (green +) > 1. Jars or directories...陰影罐子。
  3. 您現在應該看到的陰影罐子在libaries列表

screenshot detailing above explanation

雖然乍看起來上班,這解決方案解決方法有幾個注意事項:

  • 非重定位類仍然可以通過Maven的模塊依賴關係進行編碼,如果您碰巧使用它們,只有在編譯Maven時纔會看到。 (你可以刪除模塊的依賴關係,但每當你重新導入你的pom時它就會被讀取)
  • 如果你的jar文件名中包含一個版本號,你每次更改項目版本時都必須更新jar路徑解決方法:指定一個靜態project.build.finalName
  • 當您添加新方法或更改簽名時,需要再次編譯庫模塊。 (這可以通過爲陰影依賴創建一個單獨的模塊來解決 - 這實際上也可以解決文件名問題)
+0

我還沒有試過在一段時間內完成此操作。目前該項目已經進行了大量重組。我的問題中提到的主要模塊現在是一個單獨的Maven項目,模塊的其餘部分分爲3個不同的項目(modules-main,modules-extra,modules-prototypes)和一個沒有任何依賴聲明的獨立共享父項。所以模塊繼承它們的依賴關係,而不是父代。我認爲現在應該可以搬遷。 我仍然喜歡你爲IntelliJ提到的解決方案 – pschichtel