plugin from exclude example dependency maven build maven-shade-plugin apache-commons-logging

from - maven-resources-plugin example



Maven build[ADVERTENCIA] tenemos una clase duplicada (8)

¿Alguien tiene alguna idea de lo que le sucedió a mi maven build? Recibo muchas advertencias duplicadas.

[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

He revisado mi repositorio de m2 local, tengo dos clases allí en commons-logging-api jar, LogFactoryImpl.class y LogFactoryImpl $ 1.class. Igual que todas las clases mencionadas en las advertencias.

Una cosa para mencionar es que estoy usando el plugin de sombra en mi 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>

Noté que el árbol de dependencias se ve así:

[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

y commons-logging.jar y commons-logging-api.jar ambos tienen org / apache / commons / logging / LogFactory.class.

de alguna manera el plugin de Shad está tratando de meterlos en un gran frasco gordo al final. entonces la advertencia se muestra. Se ha dicho que esto es una advertencia ignorable. Pero estoy un poco preocupado, ¿cómo sabe la aplicación cuál es la clase exacta que debería usarse si hay dos clases duplicadas con el mismo nombre?


Eche un vistazo a la sección "Exclusiones de dependencia" en el documento de Maven .

En el ejemplo proporcionado, excluiré el commons-logging:commons-logging-api:jar:1.0.4:compile dependencia de org.apache.hadoop.hive:hive-common:jar:0.7.1-cdh3u3:compile . En tu 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>


En mi caso, confiaba en un paquete que también crea un tarro sombreado.

Los jarrones sombreados están destinados a la implementación, no a la instalación como una dependencia.

Al crear un POM de dependencia reducido durante el proceso de compilación de la dependencia, se instruye a maven sobre qué dependencias se pueden omitir.

En la configuración maven-shade-plugin:

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

Para más detalles, vea esta publicación:

¿Para qué se utiliza el plugin maven-shade-plugin y por qué te gustaría reubicar los paquetes java?

El error que estaba recibiendo de maven:

ADVERTENCIA: x.jar, y.jar contienen clases superpuestas


En mi caso, mi padre pom estaba incluyendo commons-beanutils y mi módulo hijo (que es lo único que quería compilar) incluía commons-io.

El complemento de sombreado se quejó de los duplicados ya que commons -io y commons-beansutil compartían algunas clases comunes. Tenga en cuenta que beansutiul se estaba incluyendo aunque no era necesario y no se usó.

Resuelvo esto minimizando el jar agregando esto a la configuración:

<minimizeJar>true</minimizeJar>

Ahora el complemento de sombreado no agregó recursos no utilizados.

La advertencia se fue.


Es posible que también hayas topado con una limitación de maven-shader-plugin. Reemplaza el artefacto de jar predeterminado (creado por maven-jar-plugin). Esto funciona bien en una compilación limpia, pero en una reconstrucción donde no se regenera el jar, el sombreador se ejecuta nuevamente en el jar que creó la última vez, que ya contiene copias de todas las dependencias de clase. Eso produce muchas advertencias sobre duplicados.

Este problema todavía no se aborda desde maven-shader-plugin 2.0: http://jira.codehaus.org/browse/MSHADE-126

Una solución es agregar explícitamente el plugin maven-jar a su pom.xml y agregar la configuración de configuración <forceCreation>true</forceCreation> .


Puede excluir el jar que no desea (los que están dando las advertencias duplicadas usando las siguientes etiquetas bajo el plugin de sombreado -

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

Se pueden encontrar más detalles en http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html


Tienes dependencias en tu pom que contienen clases duplicadas pero sin el pom apropiado no podría decir una palabra al respecto.


Todo lo anterior (sobre la revisión del árbol de dependencias y exclusión) es correcto en la mayoría de los casos, pero en mi caso (no tuve superposición en mis dependencias) la clean preliminar ayudó (aunque no sé por qué):

mvn clean package


Vi que esto sucedió en eclipse cuando actualicé las dependencias de mi proyecto padre.

Eliminé todos los archivos en mi directorio de destino y solucionó los problemas.