当前位置: 首页 > 知识库问答 >
问题:

使用maven-shade-plugin时,依赖冲突怎么办?

贝洲
2023-03-14

我正在使用maven-shade-plugin创建一个包含我项目所有依赖项的可执行jar。有时,这些依赖项会带来自己的依赖项,这些依赖项会与其他库的依赖项发生冲突,而maven-shade-plugin会警告我不确定在uber jar中包含哪个版本。

[WARNING] maven-shade-plugin has detected that some .class files
[WARNING] are present in two or more JARs. When this happens, only
[WARNING] one single version of the class is copied in the uberjar.
[WARNING] Usually this is not harmful and you can skeep these
[WARNING] warnings, otherwise try to manually exclude artifacts
[WARNING] based on mvn dependency:tree -Ddetail=true and the above
[WARNING] output

通常,我对此警告的回应是使用

<!-- Amazon ElastiCache Client -->
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>elasticache-java-cluster-client</artifactId>
    <version>1.0.61.0</version>
    <exclusions>
        <!-- this junit dependency clashes with our test-scoped one and causes integration tests to fail to run -->
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit-dep</artifactId>
        </exclusion>
        <!-- this dependency brings in two versions of cglib that clash with one another -->
        <exclusion>
            <groupId>jmock</groupId>
            <artifactId>jmock-cglib</artifactId>
        </exclusion>
        <!-- newer versions of these dependencies come with dropwizard-core -->
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
</dependency>

当我这样做时,我使用mvn依赖项:tree来确保我排除了违规依赖项的较低版本,希望最新版本是最成熟且没有错误的。

像上面这样的案例,最终有很多排除在外的情况,对这种做法提出了两个问题:

    < li >在上面的示例中,为什么我必须手动排除junit和jmock?这两个依赖项都标记为< code >

共有1个答案

吕俊美
2023-03-14

你尝试过用DependencyConvergence规则添加maven强制插件吗?这对我来说与阴影插件结合使用效果很好。它将告诉您哪些工件引入了相同类的不同版本。它让我找到了我必须排除的东西。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-enforcer-plugin</artifactId>
            <executions>
                <execution>
                    <id>enforce</id>
                    <configuration>
                        <rules>
                            <DependencyConvergence/>
                        </rules>
                    </configuration>
                    <goals>
                        <goal>enforce</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
 类似资料:
  • 由一些模块组成的maven项目。我的一个模块正在使用google版本的guava依赖项。现在,我正在我的项目中集成另一个模块,该模块也使用guava但版本。 因此,我希望新模块使用guava版本,而其余项目使用guava版本。我尝试将guava的添加到新模块中,但没有成功。 更新:@Guillaume Darmont的答案为不同的模块解决了问题。但现在我的问题是,新模块有两个依赖项,其中一个使用g

  • 我有一个具有以下依赖项的GWT项目 > Gin 2.1.2依赖于guice 3.0,而owlapi 4.0.2依赖于guice 4.0-beta。 gin在客户端使用,而owlapi在服务器端使用。 我有什么办法才能让这件事成功?我是否可以在保留正常运行的GWT devmode的同时使用依赖关系范围?

  • 我有一个项目,它使用maven-assembly-plugin打包了几个(可执行的jar)程序集--基本上相同的代码,但针对不同的客户机使用了不同的数据集。 我需要在可执行jar中使用spring,由于spring中的文件命名,我需要使用maven-shade-plugin创建jar。这工作很好,我可以创建可执行的jar,但我不能确定如何将我的其他文件组装到这个新的shaded jar,因为sha

  • 问题内容: 假设我有四个项目: 项目A(依赖于B和D) 项目B(依赖于D) 项目C(依赖于D) 项目D 在这种情况下,如果我运行项目A,则Maven将正确地解决对D的依赖关系。如果我理解正确,则Maven始终以最短的路径获取依赖关系。由于D是A的直接依赖项,因此将使用B内指定的D而不是D。 但是现在假设这种结构: 项目A(依赖于B和C) 项目B(依赖于D) 项目C(依赖于D) 项目D 在这种情况下

  • 错误为:java.security.NoSuchProviderException:JCE无法验证提供程序BC。注意,我已经添加了这段代码:security.addProvider(new BouncyCastleProvider()); 这在使用spring boot embedded tomcat时可以很好地工作,但在导出到运行在wildfly服务器上的war文件时就不行了。 下面是我如何宣布

  • Maven shade plugin 为 Maven 提供了 Jar 打包的神器,包括将所依赖的 jar 包都打包到一起。