Frage Maven build [WARNING] Wir haben eine doppelte Klasse


Hat jemand eine Ahnung, was mit meinem Maven Build passiert ist? Ich bekomme viele doppelte Warnungen.

[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

Ich habe in meinem lokalen m2 Repo nachgesehen, ich habe dort zwei Klassen in Commons-Logging-API Jar, LogFactoryImpl.class und LogFactoryImpl $ 1.Class. Wie alle in den Warnungen erwähnten Klassen.

Eine Sache zu erwähnen ist, dass ich ein Schatten-Plugin in meiner pom.xml verwende.

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

Ich habe bemerkt, dass der Abhängigkeitsbaum wie folgt aussieht

[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

und commons-logging.jar und commons-logging-api.jar haben beide org / apache / commons / logging / LogFactory.class.

Irgendwie versucht Shad plugin sie am Ende in ein großes Fettglas zu drücken. dann wird die Warnung angezeigt. Es wurde gesagt, dass dies eine ignorante Warnung ist. Aber ich bin ein bisschen besorgt, wie kann die Anwendung wissen, was ist die genaue Klasse sollte verwendet werden, wenn es zwei doppelte Klasse mit dem gleichen Namen gibt?


26
2018-03-21 10:30


Ursprung


Antworten:


Werfen Sie einen Blick auf den Abschnitt "Abhängigkeitsausschlüsse" in der Maven Dok.

In Ihrem bereitgestellten Beispiel schließe ich die commons-logging:commons-logging-api:jar:1.0.4:compile Abhängigkeit von org.apache.hadoop.hive:hive-common:jar:0.7.1-cdh3u3:compile. In deiner 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
2018-03-21 15:34



Sie könnten auch auf eine Beschränkung von Maven-Shader-Plugin gestoßen sein. Es ersetzt das Standard-Jar-Artefakt (erstellt von maven-jar-plugin). Dies funktioniert bei einem sauberen Build, aber bei einer Neuerstellung, bei der das JAR nicht neu generiert wird, wird der Shader beim letzten Mal erneut in dem JAR ausgeführt, das bereits Kopien aller Klassenabhängigkeiten enthält. Das erzeugt eine Menge Warnungen über Duplikate.

Dieses Problem ist noch immer nicht behoben wie bei maven-shader-plugin 2.0: http://jira.codehaus.org/browse/MSHADE-126

Eine Umgehungslösung besteht darin, das maven-jar-plugin explizit zu Ihrer pom.xml hinzuzufügen und die Konfigurationseinstellung hinzuzufügen <forceCreation>true</forceCreation>.


10
2018-04-02 21:30



In meinem Fall war mein Eltern-Pom Commons-Beanutils und mein Kind-Modul (was das einzige war, was ich kompilieren wollte) war commons-io.

Der Schattenstecker klagte über Duplikate, da commons-io und commons-beansutil einige gemeinsame Klassen teilten. Beachte, dass beansutiul enthalten war, obwohl es nicht benötigt wurde und nicht verwendet wurde.

Ich löse dies, indem ich das JAR minimiert, indem ich dieses zur Konfiguration hinzufüge:

<minimizeJar>true</minimizeJar>

Jetzt hat das Schatten-Plugin keine ungenutzten Ressourcen hinzugefügt.

Die Warnung ging weg.


3
2017-10-02 13:51



Sie können das Glas, das Sie nicht wollen (das, das die doppelten Warnungen gibt, mit den folgenden Tags unter dem Schatten-Plugin ausschließen):

    <configuration>
    <artifactSet>
      <excludes>
        <exclude>commons-logging:commons-logging</exclude>
      </excludes>
    </artifactSet>
    <minimizeJar>true</minimizeJar>
    </configuration>

Weitere Details finden Sie unter http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html 


1
2017-12-03 17:53



Sie haben Abhängigkeiten in Ihrem Pom, die doppelte Klassen enthalten, aber ohne den passenden Pom konnte ich kein Wort darüber sagen.


0
2018-03-21 11:58



Ich habe gesehen, dass dies in der Finsternis passiert ist, als ich die Abhängigkeiten meines Elternprojekts aktualisiert habe.

Ich habe alle Dateien in meinem Zielverzeichnis gelöscht und die Probleme behoben.


0
2017-12-09 21:43



Alles oben (zum Überprüfen von Abhängigkeiten und Ausschließen) ist in den meisten Fällen korrekt, aber in meinem Fall (ich hatte keine Überlappungen in meinen Abhängigkeiten) vorläufig cleangeholfen (weiß aber nicht warum):

mvn reinigen package


0
2018-03-06 14:38



In meinem Fall war ich auf ein Paket angewiesen, das auch ein schattiertes Glas erzeugt.

Schattierte Gläser sind für den Einsatz gedacht und nicht als Abhängigkeit installiert.

Das Erstellen eines POM mit reduzierter Abhängigkeit während des Erstellungsprozesses der Abhängigkeit weist maven an, auf welche Abhängigkeiten verzichtet werden kann.

In der Maven-Schatten-Plugin-Konfiguration:

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

Für weitere Details siehe diesen Beitrag:

Wozu dient das maven-shade-plugin und warum sollten Sie Java-Pakete verschieben?

Der Fehler, den ich von Maven bekommen habe:

WARNUNG: x.jar, y.jar enthalten überlappende Klassen


0
2018-02-07 02:13