web-dev-qa-db-ja.com

Mavenビルド[警告]重複するクラスがあります

誰かが私の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という2つのクラスがあります。警告で言及されているすべてのクラスと同じです。

言及すべきことの1つは、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

およびcommons-logging.jarとcommons-logging-api.jarはどちらもorg/Apache/commons/logging/LogFactory.classを持っています。

どういうわけか、Shadプラグインは、最後にそれらを大きな太いjarに圧入しようとしています。その後、警告が表示されます。これは無視できる警告であると言われています。しかし、私は少し心配しています。同じ名前の2つの重複するクラスがある場合、アプリケーションはどのクラスを使用すればよいのかをどのようにして知るのでしょうか。

29
Shengjie

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>
9
ndeverge

また、maven-shader-pluginの制限に遭遇した可能性もあります。デフォルトのjarアーティファクト(maven-jar-pluginによって作成される)を置き換えます。これはクリーンビルドでは正常に機能しますが、jarが再生成されない再ビルドでは、シェーダーは前回作成したjarで再度実行されます。jarには、すべてのクラス依存関係のコピーが既に含まれています。それは重複について多くの警告を生成します。

この問題はmaven-shader-plugin 2.0の時点ではまだ対処されていません: https://issues.Apache.org/jira/browse/MSHADE-126

回避策の1つは、maven-jar-pluginを明示的にpom.xmlに追加し、構成設定<forceCreation>true</forceCreation>を追加することです。

10
user1454388

私の場合、私の親pomにはcommons-beanutilsが含まれており、私の子モジュール(コンパイルしたいのはこれだけです)にはcommons-ioが含まれていました。

Commons-ioとcommons-beansutilがいくつかの共通クラスを共有しているため、シェードプラグインは重複について不平を言っていました。 beansutiulは不要であるにもかかわらず使用されていないことに注意してください。

これを構成に追加してjarを最小化することでこれを解決します。

<minimizeJar>true</minimizeJar>

シェードプラグインは未使用のリソースを追加しませんでした。

警告は消えた。

4
Somaiah Kumbera

不要な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 にあります。

1
Suman

私の場合、影付きのjarも作成するパッケージに依存していました。

網掛けのjarファイルは、依存関係としてインストールするのではなく、デプロイメント用です。

依存関係のビルドプロセス中に依存関係の少ないPOMを作成すると、依存関係を省略できるmavenに指示します。

Maven-shade-plugin設定では:

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

詳細については、この投稿を参照してください:

maven-shade-pluginは何に使用されますか。また、なぜ再配置する必要があるのですかJavaパッケージ?

私がmavenから得ていたエラー:

警告:x.jar、y.jarには重複するクラスが含まれています

0
comfytoday

重複するクラスを含む依存関係がpomにありますが、適切なpomがなければ、それについてWordを言うことができませんでした。

0
khmarbaise

親プロジェクトの依存関係を更新したとき、これがEclipseで発生するのを見ました。

ターゲットディレクトリのすべてのファイルを削除し、問題を修正しました。

0
Ben

上記のすべて(依存関係ツリーの確認と除外について)はほとんどの場合に適切ですが、私の場合(依存関係が重複していませんでした)予備cleanが役立ちました(理由はわかりません)。

mvn clean package

0
radistao