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