2012-08-06 13 views
21

To jest mój projekt POM (link to the paste, so you can right click > save as pom.xml)Ostrzeżenie dotyczące wtyczki koloru Maven: mamy duplikat - jak to naprawić?

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

Poszedłem za radą konfiguracji domyślnej wtyczki jar jak reklamowane w the FAQ, ale gdy uruchamiam mvn package około 20K ostrzeżenia są wydawane. Uruchamianie mvn clean również nie pomaga.

Zgodnie z mogłem ręcznie wykluczyć niektóre zależności. Nie wiem jednak, czy jest to właściwa droga, a drzewo zależności jest dość skomplikowane, więc trudno jest stwierdzić, od czego zacząć.

Wiem, że te problemy nie są szkodliwe, ale jestem przyzwyczajony do traktowania ostrzeżeń jako czegoś, co musi zostać naprawione. Co więcej, jestem początkującym użytkownikiem Mavena, więc chciałbym zrozumieć, co jest nie tak z moim zrozumieniem i jak rozwiązywać problemy.

(Używanie wtyczki Maven montażu nie jest opcją tutaj)

Odpowiedz

24

Czasami zdarza się, że sama definicja klasy znajduje się w dwóch lub więcej plików JAR (zwykle są to JAR zależnościami). W takim przypadku deweloper nie może nic zrobić poza próbą wykrycia, co ręcznie wykluczyć z zależności lub z ostatecznego artefaktu (być może przy pomocy mvn dependency:tree -Ddetail=true). I opened an issue and submitted a patch, aby pomóc programiście z nieco ładniejszej wyjścia jak

[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 

Korzystanie z tego wyjścia i że od mvn dependency:tree dodałem sekcje jak

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

i udało się zmniejszyć liczbę ostrzeżeń od kilku tysięcy do kilka dziesiątek. Mimo to nie jest to doskonałe. Nadal jednak kontynuują kopiowanie klas prowadzących do konfliktów nazw (nie rozumiem dlaczego). Jednak to rozwiązanie jest specyficzne dla tego konkretnego projektu i nie można go łatwo przenieść na cokolwiek innego.

2

Jako nowsza aktualizacja tego problemu jest aktualizowanie do bieżącej wtyczki maven. Pytanie korzysta

<version>1.7.1</version> 

który będzie tylko powiedzieć, że:

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 

dzięki czemu można odgadnąć lub prób i błędów, gdzie pierwsza pozycja, gdzie trzeba nakładających klas. Niezbyt przydatne. Fortunatly,

<version>3.1.0</version> 

daje większą moc użyteczna, który zawiera słoiki skąd one pochodzą: np

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

Możesz następnie zdecydować o wykluczeniu jednego lub drugiego lub użyć cienia, aby zmienić nazwy zajęć zgodnie z projektem.