8

Tôi sử dụng plugin lắp ráp Maven để tạo một assembly cho dự án đa mô-đun của tôi. Có hai ứng dụng riêng biệt được xây dựng từ dự án đa mô-đun này, mỗi ứng dụng có một bộ phụ thuộc riêng biệt. Tôi đã thực hiện một mô tả lắp ráp tùy chỉnh, tập hợp hai thư mục (cho mỗi ứng dụng) với các mô đun xây dựng và các phụ thuộc tương ứng của chúng. Nó làm tất cả mọi thứ tốt đẹp nhưng một điều - nó đặt phụ thuộc cho cả hai mô-đun để lắp ráp của nhau.Quản lý phụ thuộc đa mô-đun với plugin lắp ráp Maven

Sau đây là một phiên bản đơn giản của dự án của tôi, có chính xác cùng một hành vi.

Hãy xem xét một dự án gồm hai mô-đun và một mô-đun lắp ráp: phụ thuộc

APP 
    module1 
    module2 
    assembly 

Tôi đã thêm thuần túy cho cuộc biểu tình:

com.test.app:module1:jar:1.0 
\- commons-cli:commons-cli:jar:1.2:compile 

com.test.app:module2:jar:1.0 
\- commons-daemon:commons-daemon:jar:1.0.8:compile 

Đây là POM mẹ:

<project> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.test</groupId> 
    <artifactId>app</artifactId> 
    <version>1.0</version> 
    <packaging>pom</packaging> 

    <modules> 
    <module>module1</module> 
    <module>module2</module> 
    <module>assembly</module> 
    </modules> 
</project> 

module1 POM:

<project> 
    <parent> 
    <groupId>com.test</groupId> 
    <artifactId>app</artifactId> 
    <version>1.0</version> 
    </parent> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.test.app</groupId> 
    <artifactId>module1</artifactId> 
    <version>1.0</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>commons-cli</groupId> 
     <artifactId>commons-cli</artifactId> 
     <version>1.2</version> 
    </dependency> 
    </dependencies> 
</project> 

module2 POM:

<project> 
    <parent> 
    <groupId>com.test</groupId> 
    <artifactId>app</artifactId> 
    <version>1.0</version> 
    </parent> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.test.app</groupId> 
    <artifactId>module2</artifactId> 
    <version>1.0</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>commons-daemon</groupId> 
     <artifactId>commons-daemon</artifactId> 
     <version>1.0.8</version> 
    </dependency> 
    </dependencies> 
</project> 

lắp ráp POM:

<project> 
    <parent> 
    <groupId>com.test</groupId> 
    <artifactId>app</artifactId> 
    <version>1.0</version> 
    </parent> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.test.app</groupId> 
    <artifactId>assembly</artifactId> 
    <version>1.0</version> 
    <packaging>pom</packaging> 

    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2.2</version> 

     <executions> 
      <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 

      <goals> 
       <goal>single</goal> 
      </goals> 
      </execution> 
     </executions> 

     <configuration> 
      <appendAssemblyId>false</appendAssemblyId> 

      <descriptors> 
      <descriptor>src/main/assembly/descriptor.xml</descriptor> 
      </descriptors> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Và cuối cùng, mô tả lắp ráp:

<assembly> 
    <id>distribution</id> 
    <includeBaseDirectory>false</includeBaseDirectory> 

    <formats> 
    <format>dir</format> 
    </formats> 

    <moduleSets> 
    <moduleSet> 
     <useAllReactorProjects>true</useAllReactorProjects> 

     <includes> 
     <include>com.test.app:module1:jar</include> 
     </includes> 

     <binaries> 
     <outputDirectory>module1</outputDirectory> 
     <unpack>false</unpack> 

     <dependencySets> 
      <dependencySet> 
      <unpack>false</unpack> 
      </dependencySet> 
     </dependencySets> 
     </binaries> 
    </moduleSet> 

    <moduleSet> 
     <useAllReactorProjects>true</useAllReactorProjects> 

     <includes> 
     <include>com.test.app:module2:jar</include> 
     </includes> 

     <binaries> 
     <outputDirectory>module2</outputDirectory> 
     <unpack>false</unpack> 

     <dependencySets> 
      <dependencySet> 
      <unpack>false</unpack> 
      </dependencySet> 
     </dependencySets> 
     </binaries> 
    </moduleSet> 
    </moduleSets> 
</assembly> 

Như bạn thấy, lắp ráp được liên kết với gói giai đoạn . Vì vậy, khi tôi thực hiện

mvn package 

từ thư mục cha, tôi có lắp ráp sau

module1/ 
    commons-cli-1.2.jar 
    commons-daemon-1.0.8.jar 
    module1-1.0.jar 
module2/ 
    commons-cli-1.2.jar 
    commons-daemon-1.0.8.jar 
    module2-1.0.jar 

Về cơ bản, vấn đề ở đây là module1 mà không phụ thuộc vào commons-daemon, nhưng plugin lắp ráp đã bao gồm sự phụ thuộc. Tương tự, với module2 và commons-cli.

Ai đó có thể giải thích lý do plugin lắp ráp hoạt động theo cách này?

Giải pháp là gì?

+0

Tôi không mong đợi hành vi kỳ lạ này từ 'maven-assembly-plugin' ... Bạn có chắc chắn không có phụ thuộc nào được đẩy vào dự án lắp ráp của bạn từ cha mẹ không? Cho chúng ta thấy cây phụ thuộc được tạo ra cho dự án lắp ráp. –

+0

Cây phụ thuộc cho mô-đun lắp ráp rõ ràng là trống, vì POM của nó không có khai báo phụ thuộc. – sertsy

Trả lời

10

Tôi luôn có những trải nghiệm tương tự bằng cách sử dụng plugin lắp ráp với các dự án đa mô-đun mà kết quả cuối cùng không phải là những gì tôi mong đợi. Tôi hy vọng một người khác có thể cung cấp câu trả lời chính xác hơn về lý do tại sao điều đó xảy ra và cách tốt nhất để sử dụng hai khái niệm đó song song.

Điều đó nói rằng, một công việc xung quanh có thể là có module1 và module2 tạo ra các tạo phẩm lắp ráp riêng của chúng có chứa các lọ và phụ thuộc tương ứng của chúng. Sau đó, bạn có thể sửa đổi tệp pom mô-đun phụ lắp ráp để có các phụ thuộc vào các tạo phẩm phân phối được tạo ra từ các mô-đun anh chị em của nó và sau đó giải nén các thành phần đó vào một assembly mới.

Trong cả hai tệp pom của Module1 và Module2, bạn có thể thêm cấu hình plugin lắp ráp vào giai đoạn gói giống như bạn đã làm với mô-đun phụ lắp ráp.

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2.2</version> 

     <executions> 
      <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      </execution> 
     </executions> 

     <configuration> 
      <descriptors> 
      <descriptor>src/main/assembly/descriptor.xml</descriptor> 
      </descriptors> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

Module1 sẽ có một src/main/lắp ráp/descriptor.xml như thế này

<assembly> 
    <id>distribution</id> 
    <includeBaseDirectory>false</includeBaseDirectory> 

    <formats> 
    <format>zip</format> 
    </formats> 

    <dependencySets> 
    <dependencySet> 
     <outputDirectory>module1</outputDirectory> 
     <unpack>false</unpack> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

Và module2 sẽ có một tương tự src/main/lắp ráp/descriptor.xml

<assembly> 
    <id>distribution</id> 
    <includeBaseDirectory>false</includeBaseDirectory> 

    <formats> 
    <format>zip</format> 
    </formats> 

    <dependencySets> 
    <dependencySet> 
     <outputDirectory>module2</outputDirectory> 
     <unpack>false</unpack> 
    </dependencySet> 
    </dependencySets> 
</assembly> 

Sau đó, trong assembly/pom.xml bạn sẽ thêm các thành phần mô-đun 1 và 2 dạng zip làm phụ thuộc

<dependencies> 
    <dependency> 
     <groupId>com.test.app</groupId> 
     <artifactId>module1</artifactId> 
     <version>1.0</version> 
     <type>zip</type> 
     <classifier>distribution</classifier> 
    </dependency> 
    <dependency> 
     <groupId>com.test.app</groupId> 
     <artifactId>module2</artifactId> 
     <version>1.0</version> 
     <type>zip</type> 
     <classifier>distribution</classifier> 
    </dependency> 
    </dependencies> 

... và cắt lên lắp ráp/src/main tập tin/lắp ráp/descriptor.xml trông như thế này

<assembly> 
    <id>distribution</id> 
    <includeBaseDirectory>false</includeBaseDirectory> 

    <formats> 
    <format>dir</format> 
    </formats> 

    <dependencySets> 
    <dependencySet> 
     <useTransitiveDependencies>false</useTransitiveDependencies> 
     <unpack>true</unpack> 
    </dependencySet> 
    </dependencySets> 

</assembly> 

Như tôi đã nói đây sẽ là một tác phẩm có thể xung quanh và không may cho biết thêm một số lượng đáng kể cấu hình XML bổ sung cho quá trình xây dựng của bạn. Nhưng nó đã có tác dụng.

+1

Cảm ơn, đã trả lời, Keith. Theo như tôi hiểu, trong ví dụ bạn đã thể hiện, nếu tôi thực thi 'mvn package' từ POM cha, trước tiên nó sẽ lắp ráp module1, sau đó module2 và mô-đun lắp ráp đóng gói sẽ đặt hai cụm đầu tiên lại với nhau. Tuy nhiên, điều này làm giảm mục đích của một mô-đun lắp ráp riêng biệt. Ý tưởng đằng sau một mô-đun riêng biệt cho một hội đồng là để đảm bảo rằng tất cả các mô-đun đã được xây dựng khi lắp ráp được tạo ra. – sertsy

+0

Giả sử tôi có một mô-đun khác - mô-đun3 phụ thuộc vào mô-đun1. Nếu ở giai đoạn gói của module1, module3 chưa được xây dựng, module1 sẽ không thể tạo ra một assembly (vì assembly được gắn với một pha gói). Đó là lý do tại sao mô-đun lắp ráp luôn được đặt cuối cùng - để đảm bảo rằng các mô-đun khác đã được tạo. Những gì bạn đề nghị sẽ làm việc trong ví dụ tôi đã đưa ra, nhưng, tôi tin rằng, đó không phải là cách đúng đắn. Tôi hy vọng tôi đã làm cho suy nghĩ của tôi rõ ràng. – sertsy

+1

Thứ tự của các mô-đun được liệt kê trong pom mẹ không liên quan. Các lò phản ứng maven sẽ xây dựng tất cả các phụ thuộc theo thứ tự xây dựng chính xác, mà nó biết làm thế nào để làm bởi vì pom lắp ráp có module1 và module2 được liệt kê như phụ thuộc. Thậm chí nếu bạn thêm module3 như là một phụ thuộc cho module1, nó sẽ xây dựng module3 đầu tiên, sau đó module1, module2, kết thúc với assembly. – Keith

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