Maven不以這種方式工作。
使用相同artifactId和groupId但使用不同版本的多個依賴項的解決方案將導致單個依賴項(所使用的版本不是確定性的)。
你不執行mvn clean package
:
兩個產物具有相同的artifactId和的groupId但是有兩個不同的版本,在戰爭的同一個lib文件夾的存在可能與其中的一個但只有mvn package
。
您使用Maven war插件的bug版本。嘗試更新它來檢查。
在構建組件的過程中,您有一個Maven插件,用於在目標文件夾的WEB-INF/lib
文件夾中複製Wicket jars 6.18.0。
您正在構建的maven WAR項目具有WAR類型的工件作爲依賴關係。在這種情況下,WAR依賴關係的依賴關係在您正在構建的WAR項目中是如此overlaid。
一個有趣的Maven的問題有關,因爲WAR依賴複製JAR:
JARs with different versions can be in WEB-INF/lib with war as dependencies
Your answer和你comment表示,其實你必須在生成一個WAR依賴。
不幸的是,沒有一個真正的長期有效的解決方案來繞過這個限制。
正如我在評論說,使用Maven的戰爭插件的packagingExcludes
屬性是一個有效的解決方法的實際問題:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<!-- ... -->
<packagingExcludes>WEB-INF/lib/wicket-*-6.18.0.jar</packagingExcludes>
</configuration>
</plugin>
但要注意,使用將做您的構建通過時間不太可靠。 當您更新WAR依賴版本的那一天以及在其新版本中,它再次提取不同版本的wicket時,仍然有在構建的WAR中有兩個不同版本的重複jar的風險。
使用the overlay功能通過指定maven-war-plugin
的overlay
元素通常會更好,因爲它專注於應用於戰爭依賴關係的疊加層。它可以及早解決問題。 其結果是,你可以定義從戰爭依賴排除任何檢票的JAR:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<version>2.4</version>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<overlays>
<overlay>
<groupId>com.whatever.youlike</groupId>
<artifactId>myArtifact</artifactId>
<excludes>
<exclude>WEB-INF/lib/wicket-*.jar</exclude>
</excludes>
</overlay>
</overlays>
</configuration>
</plugin>
這種方式是更好的,但是這仍然是一個解決辦法。
依賴關係WAR被更新的日子,並且它拉取在實際構建中聲明但具有不同版本的新依賴項(Wicket除外),那麼您可能會完成相同類型的問題。
我認爲聲明WAR文物的依賴關係應該只做,因爲我們沒有選擇。
由於poms和項目重構是可能的,引入兩個WAR所依賴的通用JAR依賴關係,並且只包含兩個WAR的常見源和資源,這使得事情變得更簡單。
能否請您發表您的pom? – BackSlash