web-dev-qa-db-fra.com

Maven build [WARNING] nous avons une classe dupliquée

Quelqu'un a une idée de ce qui est arrivé à mon maven build? Je reçois beaucoup d'avertissements en double.

[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

J'ai consulté mon dépôt M2 local, j'ai deux classes dans commars-logging-api jar, LogFactoryImpl.class et LogFactoryImpl $ 1.class. Identique à toutes les classes mentionnées dans les avertissements.

Une chose à mentionner est que j'utilise le plugin shade dans mon 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>

J'ai remarqué que l'arbre de dépendance ressemble à celui ci-dessous

[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

et commons-logging.jar et commons-logging-api.jar ont tous deux l'org/Apache/commons/logging/LogFactory.class. 

d'une manière ou d'une autre, le plugin Shad tente de les insérer dans un gros bocal à la fin. alors l'avertissement apparaît. Il a été dit que cet avertissement est ignorable. Mais je suis un peu inquiet. Comment l’application sait-elle quelle est la classe exacte à utiliser s’il existe deux classes dupliquées portant le même nom?

27
Shengjie

Jetez un coup d’œil à la section "Exclusions de dépendance" dans le document Maven doc .

Dans votre exemple fourni, je vais exclure la dépendance commons-logging:commons-logging-api:jar:1.0.4:compile de org.Apache.hadoop.Hive:hive-common:jar:0.7.1-cdh3u3:compile. Dans votre 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

Vous avez peut-être aussi rencontré une limitation de maven-shader-plugin. Il remplace l'artefact jar par défaut (créé par maven-jar-plugin). Cela fonctionne bien sur une construction propre, mais sur une reconstruction où le fichier jar n'est pas régénéré, le shader s'exécute à nouveau sur le fichier jar créé précédemment, qui contient déjà des copies de toutes les dépendances de classe. Cela produit beaucoup d’avertissements concernant les doublons.

Ce problème n'a toujours pas été résolu pour le compte de maven-shader-plugin 2.0: https://issues.Apache.org/jira/browse/MSHADE-126

Une solution consiste à ajouter explicitement le maven-jar-plugin à votre fichier pom.xml et à ajouter le paramètre de configuration <forceCreation>true</forceCreation>.

10
user1454388

Dans mon cas, mon parent pom incluait commons-beanutils et mon module enfant (qui est la seule chose que je voulais compiler) incluait commons-io.

Le plug-in de l'ombrage s'est plaint des doublons, car commons-io et commons-beansutil partageaient certaines classes communes. Notez que beansutiul était inclus même si cela n’était pas nécessaire et n’était pas utilisé.

Je résous cela en minimisant le bocal en ajoutant ceci à la configuration:

<minimizeJar>true</minimizeJar>

Maintenant, le plugin shade n'ajoutait pas de ressources inutilisées.

L'avertissement est parti.

3
Somaiah Kumbera

Vous pouvez exclure le bocal que vous ne voulez pas (ceux qui donnent les avertissements dupliqués à l’aide des balises suivantes sous le plugin shaden - 

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

Plus de détails peuvent être trouvés sur http://maven.Apache.org/plugins/maven-shade-plugin/shade-mojo.html

1
Suman

Dans mon cas, je m'appuyais sur un paquet qui crée également un pot ombré.

Les fichiers jar ombrés sont destinés au déploiement et non à l’installation en tant que dépendance.

La création d'un POM de dépendance réduit pendant le processus de construction de la dépendance indique au maven sur quelles dépendances peuvent être omises. 

Dans la configuration de maven-shade-plugin:

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

Pour plus de détails voir ce post:

À quoi sert le plugin maven-shade-plugin, et pourquoi voudriez-vous déplacer les paquets Java?

L'erreur que je recevais de maven:

ATTENTION: x.jar, y.jar contiennent des classes qui se chevauchent

0
comfytoday

Vous avez des dépendances dans votre pom qui contiennent des classes en double, mais sans le pom approprié, je ne pourrais pas en dire un mot.

0
khmarbaise

J'ai vu cela se produire dans Eclipse lorsque j'ai mis à jour les dépendances de mon projet parent.

J'ai supprimé tous les fichiers de mon répertoire cible et le problème a été résolu.

0
Ben

Tout ce qui précède (à propos de l'examen de l'arbre de dépendances et de l'exclusion) est correct dans la plupart des cas, mais dans mon cas (je n'ai pas eu de chevauchement dans mes dépendances), un clean préliminaire a aidé (je ne sais pas pourquoi):

mvn clean package

0
radistao