2012-03-21 27 views
24

Bất kỳ ai có bất kỳ ý tưởng gì đã xảy ra với việc xây dựng maven của tôi? Tôi nhận được rất nhiều cảnh báo trùng lặp.Maven xây dựng [CẢNH BÁO] chúng tôi có một lớp trùng lặp

[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 

Tôi đã xem xét repo m2 cục bộ của mình, tôi có hai lớp trong đó commons-logging-api jar, LogFactoryImpl.class và LogFactoryImpl $ 1.class. Giống như tất cả các lớp được đề cập trong các cảnh báo.

Một điều cần lưu ý là tôi đang sử dụng plugin bóng râm trong tệp pom.xml của mình.

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

tôi nhận thấy rằng các cây phụ thuộc trông giống như dưới đây

[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 

và commons-logging.jar và commons-logging-api.jar cả hai đều có org/apache/commons/đăng nhập/LogFactory. lớp học.

bằng cách nào đó plugin Shad đang cố gắng ép chúng vào một lọ lớn chất béo ở cuối. sau đó cảnh báo sẽ hiển thị. Nó được cho biết đây là cảnh báo đáng nể. Nhưng tôi hơi lo lắng, Làm thế nào để ứng dụng biết lớp chính xác nên được sử dụng nếu có hai lớp trùng lặp có cùng tên?

+1

LogFactoryImpl.class và LogFactoryImpl $ 1.class lớp với $ 1 trong tên là lớp địa phương bên trong LogFactoryImpl. – khmarbaise

Trả lời

8

Hãy xem phần "Loại trừ phụ thuộc" trong Maven doc.

Trong ví dụ bạn đã cung cấp, tôi sẽ loại trừ phụ thuộc commons-logging:commons-logging-api:jar:1.0.4:compile từ org.apache.hadoop.hive:hive-common:jar:0.7.1-cdh3u3:compile. Trong tệp pom.xml của bạn:

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

Cảm ơn rất nhiều, điều đó có ý nghĩa. vậy cách tốt nhất để quản lý các phụ thuộc như thế này là gì. giả sử, bạn có projectA.jar, projectB.jar, chúng có cùng phụ thuộc trong các phiên bản khác nhau. ví dụ. dependency.1.0, dependency.2.0. Nó có rủi ro để chỉ sử dụng một trong số họ. Có cách nào để cho ProjectA tiếp tục sử dụng depdency.1.0 trong khi ProjectB vẫn sử dụng dependency.2.0 không? – Shengjie

+1

Không, không có cách nào (có thể với OSGI nhưng tôi không phải là chuyên gia trong lĩnh vực này). Trong trường hợp này, nó là trình nạp lớp mà chọn lớp để sử dụng (tùy thuộc vào hệ điều hành, JVM, v.v ..., nó thường là tham chiếu đầu tiên được tham chiếu trong classpath được sử dụng). Đặt cược tốt nhất của bạn là lấy phiên bản mới nhất (loại trừ các phiên bản khác), hy vọng rằng nó tương thích ngược ... Nhưng tốt hơn là để cho trình nạp lớp chọn cho bạn. –

0

Bạn có phụ thuộc trong pom của bạn có chứa các lớp trùng lặp nhưng không có pom thích hợp tôi không thể nói một lời về nó.

+0

đã thêm thông tin khác, bạn có thể xem lại thông tin này không? Cảm ơn – Shengjie

+0

Bạn đã kiểm tra xem phụ thuộc nào có chứa các lớp trùng lặp không? Dựa trên đầu ra của bạn, commons-logging-api-1.0.4.jar dường như đến từ việc sử dụng một phiên bản api khác (trùng lặp) hoặc bạn đang sử dụng một nhà cung cấp đăng nhập khác (slf4j?). – khmarbaise

8

Bạn cũng có thể gặp phải hạn chế của trình cắm maven-shader-plugin. Nó thay thế các tạo phẩm jar mặc định (được tạo bởi maven-jar-plugin). Điều này làm việc tốt trên một xây dựng sạch, nhưng trên một xây dựng lại nơi jar không được tái tạo, các shader chạy một lần nữa trên jar nó tạo ra thời gian qua, trong đó đã có bản sao của tất cả các phụ thuộc lớp. Điều đó tạo ra rất nhiều cảnh báo về các bản sao.

Vấn đề này vẫn chưa được giải quyết như của maven-shader-plugin 2.0: http://jira.codehaus.org/browse/MSHADE-126

Một workaround là thêm maven-jar-plugin một cách rõ ràng để pom.xml của bạn và thêm các thiết lập cấu hình <forceCreation>true</forceCreation>.

+0

Đây là những gì gây ra cho tôi. Bạn có thể giải quyết nó bằng cách làm theo các giải pháp ở đây: http://stackoverflow.com/questions/8880361/superfluous-warnings-when-using-maven-shade-plugin – stantonk

3

Trong trường hợp của tôi, cha mẹ tôi đã bao gồm hạt đậu phộng và mô-đun con của tôi (đó là điều duy nhất tôi muốn biên dịch) đã bao gồm commons-io.

Nút đổ bóng trong phàn nàn về các bản sao kể từ khi commons-io và commons-beansutil chia sẻ một số lớp phổ biến. Lưu ý rằng beanutiul đã được đưa vào mặc dù nó không cần thiết, và không được sử dụng.

tôi giải quyết việc này bằng cách giảm thiểu jar bằng cách thêm này để cấu hình:

<minimizeJar>true</minimizeJar> 

Bây giờ các plugin bóng râm không thêm nguồn lực chưa được sử dụng.

Cảnh báo biến mất.

1

Bạn có thể loại trừ jar bạn không muốn (những người mà đang đưa ra những lời cảnh báo trùng lặp sử dụng các thẻ sau đây theo các plugin bóng râm -

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

Thông tin chi tiết có thể được tìm thấy tại http://maven.apache.org/plugins/maven-shade-plugin/shade-mojo.html

0

Tôi thấy điều này xảy ra trong nhật thực khi tôi cập nhật các phụ thuộc của dự án phụ huynh của tôi

Tôi đã xóa tất cả các tệp trong thư mục đích của mình và nó đã khắc phục được sự cố.

0

Tất cả các điều trên (về việc xem xét cây phụ thuộc và loại trừ) là chính xác trong hầu hết các trường hợp, nhưng trong trường hợp của tôi (tôi không có chồng chéo trong các phụ thuộc của tôi) sơ bộ clean đã giúp (không biết tại sao):

mvn clean package

0

Trong trường hợp của tôi, tôi đang dựa vào một gói cũng tạo ra một bóng mờ.

Bình bóng mờ có nghĩa là để triển khai, không cài đặt dưới dạng phụ thuộc.

Tạo phụ thuộc giảm POM trong quá trình xây dựng của phụ thuộc, chỉ thị cho maven mà phụ thuộc có thể được bỏ qua.

Trong cấu hình maven-bóng-plugin:

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

Để biết thêm chi tiết, xem bài này:

What is the maven-shade-plugin used for, and why would you want to relocate java packages?

Các lỗi tôi đã nhận được từ maven:

CẢNH BÁO: x.jar, y.jar chứa các lớp chồng chéo

Các vấn đề liên quan