Maven build [WARNING] nous avons une classe duplicate
Quelqu'un a une idée de ce qui est arrivé à ma construction maven? Je reçois beaucoup de doubles Avertissements.
[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/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.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 regardé dans ma repo m2 locale, j'ai deux classes là-bas dans commons-logging-api jar, LogFactoryImpl.classe et LogFactoryImpl$1.classe. Comme pour toutes les catégories 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 le l'arbre de dépendance ressemble comme 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.les deux jar ont org/apache/commons/logfactory.classe.
en quelque sorte Shad plugin essaie de les presser dans un grand pot de graisse à la fin. alors l'avertissement apparaît. On dit que c'est un avertissement ignorable. Mais je suis un peu inquiet, comment l'application sait-elle Quelle est la classe exacte devrait être utilisée s'il ya deux classes dupliquées avec le même nom?
8 réponses
jetez un coup d'oeil à la section" Exclusions de personnes à charge "dans le Maven doc .
dans votre exemple, j'exclurai 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>
vous pourriez aussi avoir rencontré une limitation de maven-shader-plugin. Il remplace l'artefact jar par défaut (créé par maven-jar-plugin). Cela fonctionne très bien sur une construction propre, mais sur une reconstruction où le bocal n'est pas régénéré, le shader court à nouveau sur le bocal qu'il a créé la dernière fois, qui contient déjà des copies de toutes les dépendances de classe. Cela produit beaucoup d'avertissements sur les doublons.
ce problème n'est toujours pas résolu depuis maven-shader-plugin 2.0: https://issues.apache.org/jira/browse/MSHADE-126
une solution consiste à ajouter explicitement le maven-jar-plugin à votre pom.xml et ajouter le paramètre de configuration <forceCreation>true</forceCreation>
.
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.
L'ombre de brancher plaint des doublons depuis commons-io et les communes-beansutil partagé en commun certaines classes. Notez que beansutiul était inclus, même s'il n'était pas nécessaire, et n'a pas été utilisé.
Je résous cela en minimisant le pot en ajoutant ceci à la configuration:
<minimizeJar>true</minimizeJar>
maintenant le plugin shade n'a pas ajouté de ressources inutilisées.
Avertissement s'en alla.
vous pouvez exclure le bocal que vous ne voulez pas (ceux qui donnent les Avertissements dupliqués en utilisant les étiquettes suivantes sous le plugin d'ombre -
<configuration>
<artifactSet>
<excludes>
<exclude>commons-logging:commons-logging</exclude>
</excludes>
</artifactSet>
<minimizeJar>true</minimizeJar>
</configuration>
plus de détails peuvent être trouvés à http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html
vous avez des dépendances dans votre pom qui contiennent des classes dupliquées mais sans la pom appropriée Je ne pourrais pas en dire un mot.
j'ai vu cela se produire dans eclipse quand j'ai mis à jour les dépendances de mon projet parent.
j'ai supprimé tous les fichiers de mon répertoire cible et il a corrigé les problèmes.
Tout ce qui précède (à propos de l'arbre des dépendances et de l'exclusion) est correct dans la plupart des cas, mais dans mon cas (je n'avais pas de chevauchement dans mes dépendances) préliminaire clean
aidé (ne sais pas pourquoi cependant):
mvn clean package
dans mon cas, je m'en remettais à un paquet qui crée aussi un bocal ombragé.
Les pots ombréssont destinés au déploiement, et non à l'installation en tant que dépendance.
la création d'un POM de dépendance réduite pendant le processus de construction de la dépendance, indique à maven les dépendances qui peuvent être laissées de côté.
dans la configuration maven-shade-plugin:
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
pour plus de détails voir cet article:
L'erreur que je recevais de maven:
avertissement: x.jar, y.jar contiennent des classes se chevauchant