2012-08-06 78 views
21

這是我的項目POM (link to the paste, so you can right click > save as pom.xml)Maven shade插件警告:我們有一個副本 - 如何解決?

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

我跟着配置默認的jar插件作爲在the FAQ廣告的建議,但仍當我運行mvn package 20K左右發出警告。運行mvn clean也沒有幫助。

根據this answer,我可以手動排除一些依賴關係。但是,我不知道這是否是正確的方法,並且依賴關係樹相當複雜,因此很難說明從哪裏開始。

我知道這些問題沒有害處,但我習慣把警告視爲必須解決的問題。此外,我是Maven的初學者,所以我想了解我的理解有什麼問題,以及如何解決問題。

(使用Maven Assembly插件是不是一個不錯的選擇)

回答

24

有時候碰巧在同一類的定義在兩個或多個JAR文件中(通常這些依賴JAR文件)。在這種情況下,除了試圖找出手動從相關性或最終構件中排除什麼(可能在mvn dependency:tree -Ddetail=true的幫助下)之外,開發人員無能爲力。我opened an issue and submitted a patch,以幫助開發人員喜歡

[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 

稍微漂亮輸出使用此輸出,並從mvn dependency:tree我添加的部分像

​​3210

和管理,以減少警告從幾千個號碼幾十個。儘管如此,這並不完美。儘管如此,他們仍在繼續複製導致名稱衝突的類(我不明白爲什麼)。儘管如此,這個解決方案是特定於這個特定項目的,並且不能輕鬆移植到其他任何項目上。

2

作爲此問題的更新更新正在更新到當前的Maven插件。 問題是使用

<version>1.7.1</version> 

這隻會告訴你,你:

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 

離開你猜測或試錯在那裏,你有重疊的類中的第一項。不是很有用。 Fortunatly,

<version>3.1.0</version> 

會給你更多的有用的輸出,包括他們來自哪裏的罐子: 例如

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

然後,您可以決定排除其中一個或另一個,或者使用陰影重命名與您的項目相適應的類。