我有一個系統,其中模塊被構建并部署到系統中。所有 jars 都位于該系統的 lib 檔案夾下。我的 jar 依賴于 2.0 版的 commons-io,其他模塊也依賴于 commons-io,但依賴于 1.1 版。因此,兩個版本都部署到 lib 檔案夾。有一種方法存在于 2.0 中,但不存在于 1.1 中。當我運行自己的 jar 時,它會選擇舊版本 1.1 ,并導致 NoSuchMethodError。我正在使用 Maven。有沒有辦法強制我的模塊使用我在 pom.xml 中設定的版本?我不能要求其他模塊維護者進行版本更改,因為這個庫是第 4 級傳遞依賴項。
uj5u.com熱心網友回復:
如果在 lib 檔案夾中有同一個 JAR 的兩個不同版本并將整個 lib 檔案夾加載到類路徑中,那么您正在玩輪盤賭。
JVM 可能會選擇一個或另一個版本,雖然從理論上講,您可能可以找出規則,但實際上,它只是不穩定。
所以,你可以做什么?一些替代方案:
- 從 lib 檔案夾中洗掉版本 1.1 并查看其他模塊是否也運行 2.0(通常,版本升級或多或少兼容)
- 使用兩個不同的 lib 檔案夾,或為兩個 JAR 手動構建類路徑。僅當它們不在同一個 JVM 中運行時才有可能。
- 使用 maven shade 插件將所需的庫著色到您自己的 JAR 中。
- 大多數
commons-io現在已經過時了,因為足夠的類/方法已經是 JDK 的一部分(從 Java 8 開始)。因此,您可能只能commons-io從專案中洗掉并使用 Java 本身進行檔案處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/357295.html
上一篇:我該如何解決這個錯誤。使用放心&eclipse:啟動層java.lang.module.FindException初始化程序中發生錯誤:
下一篇:我不斷收到錯誤無法在指定路徑/usr/lib/jvm/java-8-openjdk-amd64/jre/../lib/jconsole.jar處找到工件sun.jdk:jconsole:jar:jdk
