【问题标题】:Maven build [WARNING] we have a duplicate classMaven 构建 [警告] 我们有一个重复的类
【发布时间】:2012-04-05 20:39:21
【问题描述】:

有人知道我的 Maven 构建发生了什么吗?我收到很多重复的警告。

[WARNING] We have a duplicate org/apache/commons/logging/impl/LogFactoryImpl$1.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar
[WARNING] We have a duplicate org/apache/commons/logging/impl/LogFactoryImpl.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar
[WARNING] We have a duplicate org/apache/commons/logging/impl/NoOpLog.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar
[WARNING] We have a duplicate org/apache/commons/logging/impl/SimpleLog$1.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar
[WARNING] We have a duplicate org/apache/commons/logging/impl/SimpleLog.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar
[WARNING] We have a duplicate org/apache/commons/logging/impl/Jdk14Logger.class in /home/shengjie/.m2/repository/commons-logging/commons-logging-api/1.0.4/commons-logging-api-1.0.4.jar

我查看了本地 m2 存储库,在 commons-logging-api jar 中有两个类,LogFactoryImpl.class 和 LogFactoryImpl$1.class。与警告中提到的所有类相同。

要提一提的是我在 pom.xml 中使用了 shade 插件。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.4</version>
            <configuration>
                <createDependencyReducedPom>true</createDependencyReducedPom>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.~~~~black out my own main class here~~~~~</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>

我注意到依赖树如下所示

[INFO] +- org.apache.cxf:cxf-bundle-jaxrs:jar:2.5.1:compile
[INFO] |  \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] \- org.apache.hadoop.hive:hive-jdbc:jar:0.7.1-cdh3u3:compile
[INFO]    \- org.apache.hadoop.hive:hive-common:jar:0.7.1-cdh3u3:compile
[INFO]       \- commons-logging:commons-logging-api:jar:1.0.4:compile

commons-logging.jar 和 commons-logging-api.jar 都有 org/apache/commons/logging/LogFactory.class。

Shad 插件不知何故试图在最后把它们挤进一个大罐子里。然后出现警告。有人说这是可以忽略的警告。但是我有点担心,如果有两个同名的重复类,应用程序怎么知道应该使用哪个确切的类?

【问题讨论】:

  • LogFactoryImpl.class 和 LogFactoryImpl$1.class 名称中带有 $1 的类是 LogFactoryImpl 内部的本地类。

标签: maven build maven-shade-plugin apache-commons-logging


【解决方案1】:

你的 pom 中有依赖项,其中包含重复的类,但没有适当的 pom,我无话可说。

【讨论】:

  • 添加了更多信息,你能再看看吗?谢谢
  • 您是否检查过哪些依赖项包含重复的类?根据您的输出,commons-logging-api-1.0.4.jar 似乎来自使用不同的 api 版本(重复)或者您正在使用其他日志记录提供程序(slf4j?)。
【解决方案2】:

查看Maven doc 中的“依赖项排除”部分。

在您提供的示例中,我将从org.apache.hadoop.hive:hive-common:jar:0.7.1-cdh3u3:compile 中排除commons-logging:commons-logging-api:jar:1.0.4:compile 依赖项。在你的 pom.xml 中:

    <dependency>
        <groupId>org.apache.hadoop.hive</groupId>
        <artifactId>hive-common:jar</artifactId>
        <version>0.7.1-cdh3u3</version>
        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

【讨论】:

  • 非常感谢,这很有道理。那么管理这样的依赖关系的最佳方法是什么。假设您有 projectA.jar、projectB.jar,它们在不同版本中具有相同的依赖项。例如。依赖.1.0,依赖.2.0。仅使用其中一个是有风险的。有没有办法让 ProjectA 继续使用 depdency.1.0 而 ProjectB 仍然使用 dependency.2.0?
  • 不,没有办法(也许使用 OSGI,但我不是这方面的专家)。在这种情况下,是类加载器选择要使用的类(取决于操作系统、JVM 等...,它通常是使用的类路径中引用的第一个 jar)。您最好的选择是采用最新版本(排除其他版本),希望它向后兼容...但总比让类加载器为您选择要好。
【解决方案3】:

您可能还遇到了 maven-shader-plugin 的限制。它替换了默认的 jar 工件(由 maven-jar-plugin 创建)。这在干净的构建上工作得很好,但是在没有重新生成 jar 的重建上,着色器再次在它上次创建的 jar 上运行,它已经包含所有类依赖项的副本。这会产生很多关于重复的警告。

从 maven-shader-plugin 2.0 开始,这个问题仍未解决:https://issues.apache.org/jira/browse/MSHADE-126

一种解决方法是将 maven-jar-plugin 显式添加到您的 pom.xml 并添加配置设置 &lt;forceCreation&gt;true&lt;/forceCreation&gt;

【讨论】:

【解决方案4】:

就我而言,我的父 pom 包含 commons-beanutils,而我的子模块(这是我唯一想要编译的)包含 commons-io。

由于 commons-io 和 commons-beansutil 共享一些公共类,因此 shade 插件抱怨重复。请注意,即使不需要也没有使用 beansutiul,它也被包含在内。

我通过将 jar 添加到配置中来最小化 jar 来解决这个问题:

<minimizeJar>true</minimizeJar>

现在阴影插件没有添加未使用的资源。

警告消失了。

【讨论】:

    【解决方案5】:

    你可以排除你不想要的罐子(那些在阴影插件下使用以下标签给出重复警告的罐子 -

        <configuration>
        <artifactSet>
          <excludes>
            <exclude>commons-logging:commons-logging</exclude>
          </excludes>
        </artifactSet>
        <minimizeJar>true</minimizeJar>
        </configuration>
    

    更多详情请关注http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html

    【讨论】:

      【解决方案6】:

      当我更新父项目的依赖项时,我在 Eclipse 中看到了这种情况。

      我删除了目标目录中的所有文件并解决了问题。

      【讨论】:

        【解决方案7】:

        以上所有内容(关于审查依赖关系树和排除)在大多数情况下都是正确的,但在我的情况下(我的依赖关系没有重叠)初步 clean 帮助(虽然不知道为什么):

        mvn <strong>clean</strong> package

        【讨论】:

          【解决方案8】:

          在我的例子中,我依赖于一个包,它也创建了一个带阴影的 jar。

          阴影 jar 用于部署,而不是作为依赖项安装。

          在依赖的构建过程中创建一个缩减的依赖POM,指示maven可以忽略哪些依赖。

          在 maven-shade-plugin 配置中:

          <configuration>
            <createDependencyReducedPom>false</createDependencyReducedPom>
          </configuration>
          

          更多详情请看这篇文章:

          What is the maven-shade-plugin used for, and why would you want to relocate java packages?

          我从 maven 得到的错误:

          警告:x.jar、y.jar 包含重叠的类

          【讨论】:

            猜你喜欢
            • 2012-08-03
            • 2017-10-28
            • 2017-08-20
            • 1970-01-01
            • 1970-01-01
            • 2015-05-21
            • 1970-01-01
            • 1970-01-01
            • 2017-04-14
            相关资源
            最近更新 更多