Este es mi proyecto POM (enlace a la pasta, así que usted 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 la configuración predeterminada frasco plugin como se anuncia en el FAQ, pero aún cuando ejecuto mvn package sobre 20K se emiten advertencias. Ejecución de mvn clean no ayuda tampoco.

Según esta respuesta, yo podría excluir manualmente algunas dependencias. Sin embargo, no sé si es el camino correcto, y el árbol de dependencia es bastante complejo, por lo que es difícil argumentar por dónde empezar.

Sé que estos temas no son dañinos, pero estoy acostumbrado a tratar las advertencias como algo que debe ser corregido. Por otra parte, soy un principiante con Maven, por lo que me gustaría entender lo que está mal con mi entendimiento, y cómo solucionar problemas.

(Utilizando maven de la asamblea plugin no es una opción aquí)

InformationsquelleAutor Raffaele | 2012-08-06

2 Comentarios

  1. 27

    A veces sucede que la misma definición de clase se encuentra en dos o más archivos JAR (por lo general, estos son la dependencia de los Frascos). En tal caso, no hay nada que el desarrollador pueda hacer, excepto tratando de averiguar qué excluir manualmente de las dependencias o desde el final del artefacto (tal vez con la ayuda de mvn dependency:tree -Ddetail=true). Yo abre un tema y presentó un parche, para ayudar a los desarrolladores con un poco más bonita de salida, 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

    El uso de esta salida y que a partir de mvn dependency:tree he añadido 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. Aún así, esto no es perfecta. Aún así, siguen copypaste clases que llevan a nombre de los enfrentamientos (no puedo entender por qué). Aún así, esta solución específica para este proyecto en particular y no puede ser fácilmente portado en otra cosa.

  2. 2

    Como una actualización más reciente a este problema es la actualización a la actual plugin de maven.
    La cuestión es el uso de

    <version>1.7.1</version>

    que sólo le dirá que:

    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

    Dejar de adivinar o de ensayo y error donde la primera entrada donde tienes la superposición de clases. No es muy útil. Afortunadamente,

     <version>3.1.0</version>

    le dará la más útil de salida que incluye los frascos de dónde proceden:
    por ejemplo,

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

    A continuación puede decidir excluir uno o el otro, o utilizar la sombra para cambiar el nombre de las clases como adecuados para su proyecto.

Dejar respuesta

Please enter your comment!
Please enter your name here