sirve que proyecto problemas para mvn funciona forzar errores error eliminar descarga dependencias crear con maven maven-shade-plugin

que - Advertencia sobre el complemento de color de Maven: tenemos un duplicado: ¿cómo solucionarlo?



mvn eclipse eclipse para que sirve (2)

A veces sucede que la misma definición de clase se encuentra en dos o más archivos JAR (generalmente estos son JAR de dependencia). En tal caso, no hay nada que el desarrollador pueda hacer excepto tratar de averiguar qué excluir manualmente de las dependencias o del artefacto final (tal vez con la ayuda de la mvn dependency:tree -Ddetail=true ). Abrí un problema y envié un parche , para ayudar al desarrollador con un resultado un poco más bonito como

[WARNING] xml-apis-1.3.02.jar, xmlbeans-2.3.0.jar define 4 overlappping classes: [WARNING] - org.w3c.dom.TypeInfo [WARNING] - org.w3c.dom.DOMConfiguration [WARNING] - org.w3c.dom.DOMStringList [WARNING] - org.w3c.dom.UserDataHandler [WARNING] maven-shade-plugin has detected that some .class files [WARNING] are present in two or more JARs. When this happens, only [WARNING] one single version of the class is copied in the uberjar. [WARNING] Usually this is not harmful and you can skip these [WARNING] warnings, otherwise try to manually exclude artifacts [WARNING] based on mvn dependency:tree -Ddetail=true and the above [WARNING] output [WARNING] See http://docs.codehaus.org/display/MAVENUSER/Shade+Plugin

Usando esta salida y la de la mvn dependency:tree agregué secciones como

<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>4.7.0</version> <exclusions> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> </exclusion> <exclusion> <groupId>bouncycastle</groupId> <artifactId>bcmail-jdk14</artifactId> </exclusion> <exclusion> <groupId>bouncycastle</groupId> <artifactId>bcprov-jdk14</artifactId> </exclusion> <exclusion> <groupId>org.bouncycastle</groupId> <artifactId>bctsp-jdk14</artifactId> </exclusion> </exclusions> </dependency>

y logró reducir el número de advertencias de varios miles a un par de docenas. Sin embargo, esto no es perfecto. Aún así, continúan con las clases de copypaste que llevan a choques de nombre (no puedo entender por qué). Aún así, esta solución es específica para este proyecto en particular y no puede ser fácilmente portada en otra cosa.

Este es mi proyecto POM (enlace al pegado, por lo que puede hacer clic derecho> guardar como pom.xml)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zybnet</groupId> <artifactId>excel-reporter</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>mvn1</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.8</version> </dependency> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>4.6.0</version> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.0.0</version> </dependency> </dependencies> <build> <resources> <resource> <directory>${project.build.sourceDirectory}</directory> </resource> </resources> <plugins> <plugin> <artifactId>maven-jar-plugin</artifactId> <configuration> <finalName>${artifactId}-${version}-tmp</finalName> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.7.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.zybnet.Main</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>

Seguí el consejo de configurar el complemento jar predeterminado como se anuncia en las Preguntas frecuentes , pero aún cuando mvn package se emiten advertencias de alrededor de 20K. Ejecutar mvn clean no ayuda tampoco.

Según esta respuesta , podría excluir manualmente algunas dependencias. Sin embargo, no sé si es la forma correcta, y el árbol de dependencia es bastante complejo, por lo que es difícil discutir dónde comenzar.

Sé que estos problemas no son perjudiciales, pero estoy acostumbrado a tratar las advertencias como algo que debe solucionarse. Además, soy un principiante con Maven, así que me gustaría entender qué es lo que está mal con mi comprensión y cómo solucionar problemas.

(El uso de plugin de montaje de maven no es una opción aquí)


Como una actualización más reciente de este problema, se está actualizando al complemento de Maven actual. La pregunta esta usando

<version>1.7.1</version>

que solo te dirá que tu:

We have a duplicate org/eclipse/persistence/internal/libraries/asm/AnnotationVisitor.class in /Users/.../repository/org/eclipse/persistence/eclipselink/2.7.0/eclipselink-2.7.0.jar

Dejándote adivinar o probar y cometer errores en la primera entrada donde tienes clases superpuestas. No es muy útil. Afortunadamente

<version>3.1.0</version>

le dará la salida más útil que incluye los archivos jar de donde provienen: por ejemplo,

annotations-3.0.1.jar, jcip-annotations-1.0.jar define 4 overlapping classes: - net.jcip.annotations.GuardedBy - net.jcip.annotations.NotThreadSafe ...

Luego, puede decidir excluir uno u otro, o usar la sombra para cambiar el nombre de las clases según sea apropiado para su proyecto.