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?

26
demandé sur beresfordt 2012-03-21 14:30:44

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>
9
répondu nico_ekito 2012-03-21 15:34:25

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

10
répondu user1454388 2018-09-15 17:13:38

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.

3
répondu Somaiah Kumbera 2013-10-02 13:51:12

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

1
répondu Suman 2013-12-03 17:53:25

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.

0
répondu khmarbaise 2012-03-21 11:58:49

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.

0
répondu Ben 2014-12-09 21:43:05

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

0
répondu radistao 2017-03-06 14:38:06

dans mon cas, je m'en remettais à un paquet qui crée aussi un bocal ombragé.

Les pots 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é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:

dans quel cas le plugin maven-shade est-il utilisé, et pourquoi voudriez-vous déplacer les paquets java?

L'erreur que je recevais de maven:

avertissement: x.jar, y.jar contiennent des classes se chevauchant

0
répondu comfytoday 2018-02-07 02:13:19