为什么Maven包含相同依赖的多个版本?

时间:2017-06-19 13:16:46

标签: java eclipse maven

我有一个Maven java网络应用程序(.WAR)项目,其中包含多个库,包括Wicket个库(但我不认为问题本身是wicket,而是行家)。

问题在于:即使我只包含Wicket 6.20.0,结果.WAR包含Wicket库的两个副本6.20.0和{{1你可以在这个截图中看到:

enter image description here

考虑到一些冲突的导入我使用:

打印了依赖树
6.18.0

commnad ...但在依赖关系树中没有提到Wicket 6.18.0 !我还使用Eclipse"依赖层次结构"进行了双重检查。查看,我可以确认没有该导入的痕迹。

我甚至搜索过字符串" 6.18.0"使用Eclipse在整个工作区中,但它无处可寻!

如何找出导致包含该重复版本库的原因?

5 个答案:

答案 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中构建项目,并查看是否获得了正确的依赖项(最有可能)。

相关问题