Maven构建[警告]我们有一个重复类

bkhjykvo  于 2022-11-02  发布在  Maven
关注(0)|答案(8)|浏览(345)

有人知道我的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阴影插件。

<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

和api.jar文件都包含org/apache/commons/logging/LogFactory.class。
不知何故Shad插件试图把它们挤到一个大的脂肪jar里。然后警告出现了。有人说这是可以忽略的警告。但我有点担心,如果有两个同名的重复类,应用程序如何知道应该使用哪个确切的类?

tzcvj98z

tzcvj98z1#

你可能也遇到了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>

rpppsulh

rpppsulh2#

请查看Maven doc中的“依赖项排除”部分。
在您提供的示例中,我将从org.apache.hadoop.hive:hive-common:jar:0.7.1-cdh3u3:compile中排除commons-logging:commons-logging-api:jar:1.0.4:compile依赖项。

<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>
bf1o4zei

bf1o4zei3#

在我的例子中,我的父pom包含了commons-beanutils,而我的子模块(这是我唯一想编译的)包含了commons-io。
由于commons-io和commons-beansutil共享一些公共类,因此shade插件抱怨了重复项。注意,beansutiul被包括在内,尽管它并不需要,也没有被使用。
我通过将以下内容添加到配置中来最小化jar来解决这个问题:

<minimizeJar>true</minimizeJar>

现在,着色插件没有添加未使用的资源。
警告消失了。

3npbholx

3npbholx4#

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

vs91vp4v

vs91vp4v5#

您可以排除不需要的jar(使用shade插件下的以下标记给出重复警告的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

djp7away

djp7away6#

当我在eclipse中更新父项目的依赖关系时,我看到了这种情况。
我删除了我的目标目录中的所有文件,它修复了问题。

vddsk6oq

vddsk6oq7#

在我的例子中,我依赖于一个包,它也创建了一个阴影jar。
阴影jar用于部署,而不是作为依赖项安装。
在依赖关系的构建过程中创建一个减少依赖关系的POM,指示maven可以忽略哪些依赖关系。
在maven-shade-plugin配置中:

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

欲了解更多详情,请参阅此帖子:
maven-shade-plugin的用途是什么?为什么要重新定位java包?
我从maven那里得到的错误是:
警告:x.jar、y.jar包含重叠的类

ubby3x7f

ubby3x7f8#

你在你的pom中有依赖关系,其中包含重复的类,但没有适当的pom,我不能说一个字。

相关问题