我有一个Maven
java网络应用程序(.WAR)项目,其中包含多个库,包括Wicket
个库(但我不认为问题本身是wicket,而是行家)。
问题在于:即使我只包含Wicket 6.20.0
,结果.WAR包含Wicket库的两个副本:6.20.0
和{{1你可以在这个截图中看到:
考虑到一些冲突的导入我使用:
打印了依赖树6.18.0
commnad ...但在依赖关系树中没有提到Wicket 6.18.0 !我还使用Eclipse"依赖层次结构"进行了双重检查。查看,我可以确认没有该导入的痕迹。
我甚至搜索过字符串" 6.18.0"使用Eclipse在整个工作区中,但它无处可寻!
如何找出导致包含该重复版本库的原因?
答案 0 :(得分:6)
Maven没有以这种方式工作。
使用相同artifactId和groupId但具有不同版本的多个依赖项的解析将导致单个依赖项(使用的版本不是决定论者)。
两个工件的存在具有相同的artifactId和groupId,但在WAR的同一个lib文件夹中有两个不同的版本可能与其中一个有关:
您不能执行mvn clean package
但只能执行mvn package
。
您使用的是Maven war插件的错误版本。尝试更新它以检查它。
您有一个Maven插件,可在构建组件期间将Wicket jar 6.18.0复制到目标文件夹的WEB-INF/lib
文件夹中。
您正在构建的maven WAR项目具有WAR类型的工件作为依赖项。在这种情况下,WAR依赖关系的依赖关系在您正在构建的WAR项目中是overlaid。
由于WAR依赖性,有关重复JAR的一个有趣的Maven问题:
JARs with different versions can be in WEB-INF/lib with war as dependencies
Your answer并且您的comment表示您的构建实际上存在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。
通过指定overlay
的{{1}}元素来使用the overlay功能通常会更好,因为它专注于应用于战争依赖关系的叠加层。它很早就解决了这个问题。
因此,您可以定义从WAR依赖项中排除任何wicket JAR:
maven-war-plugin
这种方式更好,但这仍然是一种解决方法 更新依赖关系WAR的那一天,它提取了在您的实际构建中声明但具有不同版本的新依赖项(Wicket除外),您可能会遇到同样的问题。
我认为声明对WAR工件的依赖应该只在我们没有选择时才能完成。
由于poms和项目重构是可能的,因此引入两个WAR所依赖的公共JAR依赖关系并且仅包含两个WAR的公共源和资源使事情变得更简单。
答案 1 :(得分:2)
嗯,我在探索时想通了。
我有类型依赖&#34;战争&#34;在项目中:
<dependency>
<groupId>com.whatever.youlike</groupId>
<artifactId>myArtifact</artifactId>
<version>1.0.7-SNAPSHOT</version>
<type>war</type>
</dependency>
显然(我没有意识到这一点,我的错在这里)这些类型的依赖项将自己包含在类路径中,方法是将所有库复制到主WAR / libs文件夹,但这些不会在依赖项中显示应用程序树/依赖层次结构。
我通过在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>
答案 2 :(得分:1)
使用clean install
,双重依赖可能会消失。
答案 3 :(得分:0)
因为其他lib可以使用相同的库但是版本不同,或者您尝试了不同的版本并且没有使mvn clean
答案 4 :(得分:0)
命令mvn dependency:tree
告诉您正确的信息 - 您在这里看到的是日食/构建问题。
清除项目中的所有目标和构建区域。如果需要,请将其从源代码管理中检出到新文件夹。
或者,您可以在IntelliJ IDEA中构建项目,并查看是否获得了正确的依赖项(最有可能)。