考虑到一些冲突的导入,我使用以下命令打印了依赖树:
mvn dependency:tree
命令...但是依赖树中没有提到Wicket 6.18.0!我还使用Eclipse的“依赖层次结构”视图进行了双重检查,并确认没有该导入的痕迹。
我甚至在整个Eclipse工作区中搜索了字符串“6.18.0”,但找不到它的任何位置!
我如何找出是什么导致了该库的重复版本被包含?
考虑到一些冲突的导入,我使用以下命令打印了依赖树:
mvn dependency:tree
命令...但是依赖树中没有提到Wicket 6.18.0!我还使用Eclipse的“依赖层次结构”视图进行了双重检查,并确认没有该导入的痕迹。
我甚至在整个Eclipse工作区中搜索了字符串“6.18.0”,但找不到它的任何位置!
我如何找出是什么导致了该库的重复版本被包含?
一个有趣的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的共同源代码和资源,可以使事情变得更简单。
dependency:tree中,因为它不是依赖关系解析的一部分。它以“原始”方式复制了lib/WAR依赖项中包含的jar文件到lib/WAR构建组件中。抱歉我不知道确切的名称:可能是怪物卡车复制?;) - davidxxx嗯,我在探索中弄清楚了。
该项目有一个“war”类型的依赖项:
<dependency>
<groupId>com.whatever.youlike</groupId>
<artifactId>myArtifact</artifactId>
<version>1.0.7-SNAPSHOT</version>
<type>war</type>
</dependency>
显然(我之前不知道,我的过错)这些类型的依赖关系将通过将所有库复制到主WAR/libs文件夹中来包含自己在classpath中,但是这些将不会显示在依赖树/依赖层次结构中。 我通过在WAR插件中配置明确的排除解决了这个问题。
<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>
clean install,这个双重依赖可能就会消失。
因为其他库可能使用相同的库但是不同的版本,或者您尝试了不同的版本但没有执行mvn clean
mvn dependency:tree 命令会告诉你正确的信息 - 这里看到的是一个 Eclipse / 构建问题。
清除项目中所有的目标和构建区域。如果需要,可以将其从源代码控制检出到新文件夹中。
或者,您可以在 IntelliJ IDEA 中构建项目,查看是否获得了正确的依赖项(很可能会)。