it-swarm.dev

Maven build [WARNUNG] Wir haben eine doppelte Klasse

Hat jemand eine Idee, 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, LogFactoryImpl.class und LogFactoryImpl $ 1. Class. Wie alle in den Warnungen genannten Klassen.

Zu erwähnen ist, dass ich in meiner pom.xml ein Schatten-Plugin 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 festgestellt, 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 verfügen beide über die Klassen org/Apache/commons/logging/LogFactory.class. 

irgendwie versucht das Shad-Plugin, sie am Ende in ein großes, fettes Gefäß zu quetschen. dann erscheint die Warnung. Es wurde gesagt, dass dies eine ignorierbare Warnung ist. Aber ich bin ein bisschen besorgt. Wie weiß die Anwendung, welche Klasse genau verwendet werden soll, wenn zwei doppelte Klassen mit demselben Namen vorhanden sind?

27
Shengjie

Sehen Sie sich den Abschnitt "Abhängigkeitsausschlüsse" im Dokument " Maven doc " an.

In Ihrem Beispiel werde 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 ausschließen. 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
ndeverge

Möglicherweise sind Sie auch auf eine Einschränkung des Maven-Shader-Plugins gestoßen. Es ersetzt das standardmäßige Jar-Artefakt (erstellt mit dem Maven-Jar-Plugin). Dies funktioniert gut bei einem sauberen Build, aber bei einem Rebuild, bei dem der Jar nicht neu erstellt wird, wird der Shader erneut auf dem Jar ausgeführt, den er beim letzten Mal erstellt hat. Dieser enthält bereits Kopien aller Klassenabhängigkeiten. Dies führt zu einer Vielzahl von Warnungen vor Duplikaten.

Dieses Problem ist seit Maven-Shader-Plugin 2.0 noch nicht angesprochen: https://issues.Apache.org/jira/browse/MSHADE-126

Eine Problemumgehung besteht darin, das Maven-Jar-Plugin explizit zu Ihrer pom.xml hinzuzufügen und die Konfigurationseinstellung <forceCreation>true</forceCreation> hinzuzufügen.

10
user1454388

In meinem Fall enthielt mein Elternteil pom Commons-Beanutils und mein Kindermodul (das einzige, was ich kompilieren wollte) war Commons-io.

Der Schatten-Plugin beklagte sich über Duplikate, da commons-io und commons-beansutil einige gemeinsame Klassen gemeinsam hatten. Beachten Sie, dass Beansutiul enthalten war, obwohl es nicht benötigt wurde und nicht verwendet wurde.

Ich löse dies, indem ich das Glas minimiere, indem ich es der Konfiguration hinzufüge:

<minimizeJar>true</minimizeJar>

Jetzt fügte das Schatten-Plugin keine ungenutzten Ressourcen hinzu.

Warnung ging weg.

3
Somaiah Kumbera

Sie können die Dose ausschließen, die Sie nicht möchten (die, die die doppelten Warnungen ausgeben, indem Sie die folgenden Tags unter dem Farb-Plugin verwenden). 

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

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

1
Suman

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

Schattierte Gläser sind für die Bereitstellung gedacht und dürfen nicht als Abhängigkeit installiert werden.

Das Erstellen eines POM mit reduzierter Abhängigkeit während des Erstellungsprozesses der Abhängigkeit weist maven an, welche Abhängigkeiten weggelassen werden können. 

In der maven-shade-plugin Konfiguration:

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

Weitere Details finden Sie in diesem Beitrag:

Wozu dient das Maven-Shade-Plugin und warum sollten Sie Java-Pakete verschieben?

Der Fehler, den ich von maven bekam:

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

0
comfytoday

Sie haben Abhängigkeiten in Ihrem Pom, die doppelte Klassen enthalten, aber ohne das entsprechende Pom könnte ich kein Wort darüber sagen.

0
khmarbaise

Ich habe dies in Eclipse gesehen, als ich die Abhängigkeiten meines übergeordneten Projekts aktualisiert habe.

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

0
Ben

Alles oben (über das Überprüfen von Abhängigkeiten und das Ausschließen von Abhängigkeiten) ist in den meisten Fällen korrekt, aber in meinem Fall (ich hatte keine Überschneidungen in meinen Abhängigkeiten) half clean (weiß nicht warum)

mvn clean package

0
radistao