Maven不是这样工作的。具有相同artifactId和groupId但版本不同的多个依赖项将结果为单个依赖项(使用的版本不确定)。在WAR的同一lib文件夹中存在两个具有相同artifactId和groupId但具有两个不同版本的构件可能与以下原因之一有关:你没有执行mvn clean package而只是mvn package;你使用了有缺陷的Maven war插件,请尝试更新它以进行检查;你有一个Maven插件,在组件构建期间将Wicket jars 6.18.0复制到目标文件夹的WEB-INF/lib文件夹中;你正在构建的maven WAR项目具有类型为WAR的依赖项。在这种情况下,WAR依赖项的依赖关系会被覆盖在你正在构建的WAR项目中。
一个有趣的Maven问题,由于WAR依赖关系而导致重复的JAR:
WEB-INF/lib中可以有不同版本的JAR,作为war的依赖项
你的回答和评论表明你的构建中实际上有WAR依赖项。
不幸的是,目前没有真正有效的长期解决方案来绕过这个限制。
如我在评论中所说,使用maven war插件的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包。
通常更好的方法是使用
覆盖功能,通过指定
maven-war-plugin
的
overlay
元素来应用覆盖。它专注于对WAR依赖项应用的覆盖,并且可以提前解决问题。因此,您可以定义排除任何来自WAR依赖项的Wicket 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构件的依赖关系。
由于POM和项目重构是可能的,引入一个公共JAR依赖关系,两个WAR都依赖于它,并且仅包含两个WAR的共同源代码和资源,可以使事情变得更简单。