2012-01-02 26 views
11

Tôi đang cố gắng giảm thiểu kích thước của UberJar bằng cách sử dụng minimizeJar của . Có vẻ như minimizeJar chỉ bao gồm các lớp được nhập tĩnh trong mã (Tôi nghi ngờ điều này vì tôi thấy LogFactory.class trong uber jar tại org\apache\commons\logging\ nhưng không có lớp nào trong gói impl được bao gồm, do đó ném java.lang.ClassNotFoundException: org.apache.commons.logging.impl.LogFactoryImpl khi tôi chạy uber-jar).định cấu hình Maven Shade minimJar để bao gồm các tệp lớp

Có cách nào tôi có thể yêu cầu plugin Shade của Maven bao gồm các gói được chỉ định vào trong jar cuối cùng cho dù số minimizeJar có gợi ý gì không?

Đây đoạn pom về những gì tôi đang cố gắng:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-shade-plugin</artifactId> 
     <version>1.5</version> 
     <executions> 
      <execution> 
       <phase>package</phase> 
       <goals> 
        <goal>shade</goal> 
       </goals> 
       <configuration> 
        <minimizeJar>true</minimizeJar> 
        <filters> 
         <filter> 
          <artifact>commons-logging:commons-logging</artifact> 
          <includes> 
           <include>org/apache/commons/logging/**</include> 
          </includes> 
         </filter>  
        </filters> 
        <transformers> 
         <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
          <mainClass>com.myproject.Main</mainClass> 
         </transformer> 
        </transformers>        
       </configuration> 
      </execution> 
     </executions> 
    </plugin> 
+1

'org/apache/commons/logging/**' chỉ khớp với các thư mục, bạn có thể muốn khớp tất cả các tệp. Thay vào đó hãy sử dụng 'org/apache/commons/logging/**/*'. – Corubba

+0

Theo gợi ý của bạn, tôi đã thử '... logging/**', '... logging/**/*', '... logging /**/*.*' nhưng không có tác dụng nào. Tôi đoán vấn đề là bao gồm được bao gồm đầu tiên sau đó minimJar bỏ qua tất cả mọi thứ khác và bó jar như nó nghĩ là phù hợp. – kunal

Trả lời

14

Chức năng này đã được thêm vào phiên bản 1.6 của maven-bóng-plugin (vừa phát hành). minimJar bây giờ sẽ không loại bỏ các lớp đã được cụ thể bao gồm với các bộ lọc. Lưu ý rằng bao gồm một số lớp của một tạo phẩm trong một bộ lọc sẽ loại trừ các lớp không được chỉ định cho tạo tác đó, vì vậy hãy chắc chắn bao gồm tất cả các lớp mà bạn cần.

Dưới đây là một ví dụ cắm config:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>1.6</version>  
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>shade</goal> 
      </goals>       
      <configuration> 
       <minimizeJar>true</minimizeJar>  
       <filters> 
        <filter> 
         <artifact>log4j:log4j</artifact> 
         <includes> 
          <include>**</include> 
         </includes> 
        </filter> 
        <filter> 
         <artifact>commons-logging:commons-logging</artifact> 
         <includes> 
          <include>**</include> 
         </includes> 
        </filter>      
       </filters> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
+0

Cấp dưới cùng ' ** 'không hoạt động đối với tôi. Nó dường như bao gồm rất nhiều thứ từ các gói khác. Thay vào đó tôi phải sử dụng ' org/apache/logging/log4j/** Log4j- *' – Quantum7

10

Tôi đang sử dụng phiên bản 2.0 của Shade Plugin Maven và tôi vẫn không thể bao gồm các lớp học sau khi "giảm thiểu" JAR.

Như một cách giải quyết, điều duy nhất mà tôi nghĩ đến là tạo tham chiếu đến các lớp cần thiết để tránh mã giảm thiểu để loại bỏ chúng. tức là:

/* 
* This block prevents the Maven Shade plugin to remove the specified classes 
*/ 
static { 
    @SuppressWarnings ("unused") Class<?>[] classes = new Class<?>[] { 
     JButton.class, 
     JMenu.class, 
     JMenuBar.class, 
     JMenuItem.class 
    }; 
} 

Tôi hy vọng các nhà phát triển Maven thực hiện một cách để xử lý tình huống này (tôi đoán là rất phổ biến).

+0

workaround đẹp :) – kunal

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