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ì?
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. –
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