2010-06-30 24 views
12

Tôi có một kịch bản trong đó tôi cần tạo một bình uber của một dự án mô-đun đa mô-đun bao gồm tất cả các mô-đun và phụ thuộc của chúng. Tôi đã thử sử dụng plugin maven shade. nhưng nó dường như chỉ hoạt động khi tôi sử dụng nó ở cấp mô-đun. Nếu tôi thêm mục plugin trong pom mẹ sau đó xây dựng phá vỡ (nó cố gắng che pom mẹ)Sử dụng plugin bóng Maven trong một dự án đa mô-đun - NullPointerException

[INFO] Replacing original artifact with shaded artifact. 
[INFO] Replacing null with C:\Projects\foo.bar\target\foobar-0.0.1-SNAPSHOT-shaded.pom 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Error creating shaded jar: null: NullPointerException -> [Help 1] 

Nó dường như có ý nghĩa kể từ khi <packaging> cho dự án mẹ maven là pom. Nhưng cần phải có một số cách để tạo ra một bình uber cho một dự án đa mô-đun ... Bất kỳ ý tưởng người nào ???

+0

workaround kiến: tạo một dự án maven với phụ thuộc cho các lọ mô-đun cá nhân và sử dụng plugin shader vào dự án này – Manoj

+2

Không thể xảy ra, đó là giải pháp đúng. –

Trả lời

13

Bạn không nên sử dụng tệp POM của dự án cha mẹ của mình để thử tô bóng; bạn nên sử dụng một dự án tổng hợp riêng cho việc này. Các dự án mẹ maven được sử dụng để thừa kế trong khi các dự án aggregator được sử dụng để thực hiện các hàm tổng hợp trên một nhóm các dự án con; như che các JAR của họ lại với nhau thành một cái bình uber. Dự án này chỉ đơn giản là một tệp pom tại thư mục gốc của dự án của bạn (cùng cấp với tất cả các thư mục con của mô-đun) tham chiếu đến các tiểu dự án và có cấu hình plugin bóng râm. Hãy chắc chắn rằng packaing được chỉ định cho pom này là JAR.

Dưới đây là documentation giải thích mối quan hệ POM và sự khác biệt giữa Tổng hợp và Thừa kế.

+0

Tôi gặp phải vấn đề tương tự và tìm thấy câu trả lời này. Tuy nhiên tôi có cấu trúc dự án chính xác như những gì bạn mô tả nhưng nó không hoạt động. Dự án cấp cao nhất (tập hợp) của tôi là loại POM, và bao gồm một vài mô-đun con. Khi tôi cố gắng che giấu một uber-jar trong tập hợp này, nó chỉ đưa ra một POM nhưng không phải là JAR. Nó sẽ là tuyệt vời nếu u có thể đưa ra một số gợi ý thêm? Cảm ơn –

+0

@Adrian Shum - Lời khuyên tốt nhất của tôi là đọc tài liệu của plugin để đảm bảo việc sử dụng của bạn đang hoạt động đúng. http: //maven.apache.org/plugins/maven-shade-plugin/Nếu bạn vẫn gặp sự cố, rất khó để tôi trợ giúp bạn mà không cần bất kỳ mã/cấu hình nào. Đăng một câu hỏi khác với càng nhiều chi tiết càng tốt giải thích những gì bạn đang cố gắng hoàn thành và những vấn đề bạn đang gặp phải. Đừng quên bao gồm cấu hình plugin bóng của pom của bạn. Sau đó liên kết đến câu hỏi ở đây và tôi sẽ xem tôi có thể giúp bạn không. –

+0

Bạn có thể sử dụng cấu hình outputFile để ép bộ kết hợp pom được đóng gói thành đầu ra. tức là mục tiêu/foo_bar.jar. Có lẽ không được hỗ trợ, nhưng nó hoạt động – mlathe

3

Có! Bạn có thể ! :-)

Shade có vấn đề về triển khai: nó không biết khi nào đang chạy trên dự án pom (không phải là jar hoặc web). Các dự án Pom không tạo ra các tạo phẩm nhị phân, sau đó bóng không tìm thấy các tệp để hợp nhất, di chuyển, v.v., ném NPE.

Để giải quyết vấn đề này, hãy tạo POM mẹ từ dự án aggegate-Pom của bạn. Bên trong nó, đặt các định nghĩa bóng râm và cấu hình cấu hình cho một số hồ sơ (ví dụ alwaysActiveProfiles.) Và cài đặt/triển khai nó với lệnh:

mvn triển khai -P -alwaysActiveProfiles

Lệnh này sẽ cài đặt râm mát này cha mẹ mà không cần chạy bóng râm plugin pom (-alwaysActiveProfiles tùy chọn supress bóng râm plugin thực hiện) và sau đó, các dự án phụ thuộc maven của bạn sẽ làm việc. pom mẹ râm mát của bạn có thể trông như thế này:

<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/maven-v4_0_0.xsd"> 

<modelVersion>4.0.0</modelVersion> 
<groupId>xxxxxxxx</groupId> 
<artifactId>web-pom</artifactId> 
<name>web-pom</name> 
<version>1.0.0-SNAPSHOT</version> 
<packaging>pom</packaging> 

<build> 
    <pluginManagement> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>1.4</version> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
         <configuration> 
          ... 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
</build> 
<dependencies> 
    ... 
</dependencies> 

<profiles> 
    <profile> 
     <id>alwaysActiveProfiles</id> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-shade-plugin</artifactId> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

Hãy nhớ rằng bạn phải có setting.xml alwaysActiveProfiles kích hoạt theo mặc định, nếu không bóng sẽ không chạy trong sự phụ thuộc của bạn dự án bóng râm-pom.

2

Tôi đã gặp vấn đề tương tự với phiên bản 1.6 của plugin, tôi cập nhật để 2.2 và các vấn đề đã được giải quyết