Maven build [警告]我们有一个重复的类

时间:2012-03-21 10:30:45

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

任何人都知道我的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 repo,我在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插件最终试图将它们挤进一个大胖罐。然后警告出现了。有人说这是可以忽略的警告。但我有点担心,如果有两个具有相同名称的重复类,应用程序如何知道应该使用的确切类?

8 个答案:

答案 0 :(得分:10)

您可能还遇到了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>

答案 1 :(得分:9)

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

在您提供的示例中,我将从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>

答案 2 :(得分:3)

在我的情况下,我的父pom包括commons-beanutils和我的子模块(这是我唯一想编译的东西)包括commons-io。

由于commons-io和commons-beansutil共享了一些常见的类,所以阴影插件抱怨重复。请注意,即使不需要,也会包含beansutiul,并且未使用。

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

<minimizeJar>true</minimizeJar>

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

警告消失了。

答案 3 :(得分:1)

您可以排除您不想要的jar(使用阴影插件下的以下标记提供重复警告的jar -

    <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

找到更多详情

答案 4 :(得分:0)

你的pom中有依赖项,它们包含重复的类,但是没有合适的pom我就不能说出来了。

答案 5 :(得分:0)

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

我删除了目标目录中的所有文件,并修复了问题。

答案 6 :(得分:0)

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

mvn clean package

答案 7 :(得分:0)

在我的情况下,我依赖的是一个也会创建阴影罐的包。

着色的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包含重叠类