簡體   English   中英

Maven 重新打包傳遞依賴

[英]Maven repackage transitive dependencies

該應用程序由模塊組成,每個模塊都是具有一個父級的特定 maven 項目。 這些模塊在主應用程序中用作 jar。 每個模塊通過 maven 使用第三方 SDK。 這些 SDK 有許多依賴項,這些依賴項可以具有相同的組和工件,但具有不同的版本。 很難管理它們,而且我們遇到了“NoSuchMethodError”的問題。 對我來說,解決問題的最簡單方法是獲取有問題的依賴項的來源和 SDK 的來源,更改包(添加一些前綴)並導入並將其放入 sdk jar 中。 但是這種方法需要:另外一個用於分叉 SDK 的 jar 的 git 存儲庫和用於發布它們的私有 Maven 存儲庫以及大量時間。 是否有 maven 插件可以幫助解決這個問題,例如可以構建包含所有依賴項的 jar(我們的模塊 jar)但可以更改所有依賴項的包的插件?

您可以嘗試使用 Maven shade 插件,它允許您重新定位類

https://maven.apache.org/plugins/maven-shade-plugin/examples/class-relocation.html

但我自己從未嘗試過。

在大多數情況下,最好嘗試對齊依賴項,以便在大多數地方使用相同的版本,並將依賴項減少到最低限度。

恭喜,您遇到了一個稱為“jar 地獄”的類路徑問題。 我知道的唯一安全工作的解決方案是為同一類的每個版本使用不同的類加載器(如果它不向后兼容)。

一個類由它的限定名(包和類名)和它被加載的類加載器標識。 如果應用程序使用默認的系統類加載器,並且類路徑中存在不同版本的相同類,則類加載器只會加載一個版本。 在 oracle JDK/JRE 中,它是第一個出現在類路徑中的。 如果幸運的話,您可以按照應用程序運行的特殊順序引入類路徑(順序和排除依賴項),但我不建議這樣做,因為它嚴重依賴於 JDK/JRE 實現。

OSGI 是一種可能對此有所幫助的技術,因為它提供了一個基於模塊的框架來使用不同的類加載器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM