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の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プラグインは最後にそれらを大きな太い瓶に押し込もうとしています。その後、警告が表示されます。これは無視できる警告だと言われています。しかし、私は少し心配しています。同じ名前の重複したクラスが2つある場合、アプリケーションはどのようにして正確なクラスを使用する必要があるかを知ることができますか?

4

8 に答える 8

13

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

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

回避策の1つは、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

不要な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を参照してください。

于 2013-12-03T17:53:25.013 に答える
0

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

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

于 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 に答える