31

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

4

8 回答 8

13

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

自 maven-shader-plugin 2.0 起,此问题仍未解决: https ://issues.apache.org/jira/browse/MSHADE-126

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

于 2013-04-02T21:30:04.577 回答
12

查看Maven 文档中的“依赖排除”部分。

在您提供的示例中,我commons-logging:commons-logging-api:jar:1.0.4:compile将从org.apache.hadoop.hive:hive-common:jar:0.7.1-cdh3u3: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>
于 2012-03-21T15:34:25.567 回答
4

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

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

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

<minimizeJar>true</minimizeJar>

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

警告消失了。

于 2013-10-02T13:51:12.853 回答
3

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

mvn clean package

于 2017-03-06T14:38:06.120 回答
1

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

    <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找到

于 2013-12-03T17:53:25.013 回答
0

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

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

于 2014-12-09T21:43:05.493 回答
0

就我而言,我依赖于一个包,它也创建了一个带阴影的 jar。

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

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

在 maven-shade-plugin 配置中:

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

有关更多详细信息,请参阅此帖子:

maven-shade-plugin 是做什么用的,为什么要重新定位 java 包?

我从 Maven 得到的错误:

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

于 2018-02-07T02:13:19.603 回答
-3

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

于 2012-03-21T11:58:49.143 回答