2012-01-11 18 views
20

Tôi đang sử dụng Maven-Shade-Plugin để tạo ra một Uber-jar có thể chạy được. Theo khung cuối cùng trên this page, kích thước của bình có thể được giảm thiểu bằng cách sử dụng:Giảm thiểu một Uber Jar đúng cách, Sử dụng Shade-Plugin

<configuration> 
     <minimizeJar>true</minimizeJar> 
</configuration> 

Nhưng tính năng này không đi vào xem xét các lớp được khai báo trong file log4j.properties. Do đó, ví dụ: org.apache.log4j.appender.TimeAndSizeRollingAppender không được bao gồm trong Uber-jar, mặc dù nó được khai báo trong tệp log4j.properties.

Tôi tin rằng tôi sẽ đối mặt với cùng một vấn đề với Spring. Nếu mã của tôi chỉ đề cập đến giao diện A và tệp Spring của tôi chứa một instantiation của lớp B thực hiện A, thì B có thể không được thêm vào jar, vì nó không có trong mã.

Làm cách nào để giải quyết vấn đề này?

+0

Alsmot, nhưng không hoàn toàn, một bản sao của http://stackoverflow.com/questions/8698814/configure-maven-shade-minimizejar-to-include-class-files – Raedwald

Trả lời

22

Chức năng này đã được thêm vào phiên bản 1.6 của plugin maven-shade (vừa được 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> 

Để onlu bao gồm các lớp học cụ thể, thêm chúng như bao gồm sử dụng đường chéo trong tên lớp trong một bộ lọc (một lần nữa, các lớp học không bao gồm sẽ được tự động tự túc).

<filter> 
    <artifact>org.yourorg:your-artifact</artifact> 
    <includes> 
    <include>org/yourorg/yourartifact/api/*</include> 
    <include>org/yourorg/yourartifact/util/*</include> 
    </includes> 
</filter> 
+0

Một bản sao của tài liệu Maven. – Raedwald

+15

Có, tôi đã viết câu trả lời này và cập nhật tài liệu Maven cùng một lúc ... – Shane

+0

Bạn có thể hỗ trợ tùy chọn "luôn giữ các lớp cụ thể" không? Ví dụ: Cấu hình liệt kê các lớp/mặt nạ cụ thể để giữ và trình cắm maven-shade-plugin tự động tính toán các lớp không sử dụng? –

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