2012-06-28 23 views
5

Tôi có một dự án đa mô-đun trong Maven biên dịch chính xác, nhưng không gói chính xác.Cách gói dự án maven đa mô-đun với các mô-đun lồng nhau

Trong maven chính pom.xml, tôi bao gồm các phân hệ như thế này:

<modules> 
    <module>module1</module> 
    <module>module1/test</module> 
    <module>module2</module> 
    <module>module2/test</module> 
    ... 
    <module>moduleN</module> 
    <module>moduleN/test</module> 
</modules> 

Không giống như các công ước maven, dự án này phải có cây nguồn thử nghiệm của nó biên dịch như là một module riêng biệt, vì sự phụ thuộc biên dịch cho kỳ thi mã khác với các phụ thuộc của mã nguồn chính. Vì vậy, giải pháp là thiết lập tất cả các mô-đun thử nghiệm để phụ thuộc vào bất kỳ mô-đun nguồn chính nào để đảm bảo chúng được biên dịch theo đúng thứ tự.

Cấu trúc thư mục cho dự án này rất không chuẩn. Tôi đã đặt pom.xml ở những vị trí mà tôi nghĩ chúng thuộc về. Mặc dù vậy, tôi không thể thay đổi cấu trúc thư mục này - nó nằm ngoài tầm kiểm soát của tôi. Nó giống như sau:

/ 
+- pom.xml 
+- module1/ 
    +- pom.xml 
    +- src/ 
     +- com/ 
      +- company/ 
      +- Module1.java 
    +- test/ 
     +- pom.xml 
     +- src/ 
      +- com/ 
      +- company/ 
       +- Module1Test.java 
... 

Đây là những gì pom.xml cho mô-đun nguồn thông thường. Đây hoạt động hoàn hảo:

<?xml version="1.0" encoding="UTF-8"?> 
<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/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>com.company</groupId> 
     <artifactId>project</artifactId> 
     <version>5.3.1-SNAPSHOT</version> 
    </parent> 

    <artifactId>module1</artifactId> 
    <packaging>jar</packaging> 

    <dependencies> 
     <dependency> 
      <groupId>com.company</groupId> 
      <artifactId>modulex</artifactId> 
      <version>${product.version}-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <finalName>${project.artifactId}</finalName> 
     <sourceDirectory>src</sourceDirectory> 

     <directory>target</directory> 
     <outputDirectory>target/classes</outputDirectory> 
     <testOutputDirectory>target/test-classes</testOutputDirectory> 

     ... 
    </build> 

</project> 

Đây là pom.xml cho một module kiểm tra:

<?xml version="1.0" encoding="UTF-8"?> 
<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/xsd/maven-4.0.0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>com.company</groupId> 
     <artifactId>project</artifactId> 
     <version>5.3.1-SNAPSHOT</version> 

     <!-- I was forced to do this because this module was 2 levels deep --> 
     <relativePath>../../pom.xml</relativePath> 
    </parent> 

    <artifactId>module1.test</artifactId> 
    <packaging>jar</packaging> 

    <dependencies> 
     <dependency> 
      <groupId>com.company</groupId> 
      <artifactId>module1</artifactId> 
      <version>${product.version}-SNAPSHOT</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <finalName>${project.artifactId}</finalName> 
     <sourceDirectory>src</sourceDirectory> 
     <testSourceDirectory>src</testSourceDirectory> 

     <directory>target</directory> 
     <outputDirectory>target/classes</outputDirectory> 
     <testOutputDirectory>target/test-classes</testOutputDirectory> 

     ... 
    </build> 

</project> 

Tuy nhiên, kể từ khi mô-đun thử nghiệm là một tiểu thư mục của module chính, tôi nhận được như sau lỗi khi nó cố gắng gói module.test:

[ERROR] Failed to execute goal on project module1.test: Could not resolve dependencies for project com.company:module1.test:jar:5.3.1- 
SNAPSHOT: Could not find artifact com.company:module1:jar:5.3.1-SNAPSHOT in repo1.maven.org (http://repo1.maven.org/maven2/) -> [Help 1] 

Đối với một số lý do, Maven nghĩ nó cần phải lấy lọ này từ một kho lưu trữ, mặc dù nó chỉ xây dựng nó trước đây ....

Tôi có cần phải di chuyển tệp pom.xml trong mô-đun 1/kiểm tra đến cấp độ gốc như cấp độ khác không? Làm thế nào tôi có thể sửa lỗi này mà không cần di chuyển tệp pom.xml?

Cảm ơn

+0

Tại sao bạn không thể thay đổi cấu trúc thư mục? Điều này sẽ gây ra rất nhiều đau đớn với Maven. Việc thay đổi cấu trúc sang bố cục thư mục mặc định của Maven sẽ đơn giản hơn. – khmarbaise

+0

Bạn có chắc chắn rằng 2 mô đun này được xây dựng trong cùng một lò phản ứng hoặc 'com.company: module1: jar: 5.3.1-SNAPSHOT' được cài đặt trong repo cục bộ không? –

+1

Tôi đã chạy thiết lập của bạn và không có vấn đề gì. Mặt khác, tôi không biết chính xác bố mẹ bạn trông như thế nào. Bạn có thể đăng bài đó không? – maba

Trả lời

7

Điều đầu tiên là trong Maven bạn có các thư mục khác nhau cho mã sản xuất và mã kiểm tra.

src/main/java 

src/test/java 

Bên cạnh đó các mã trong src/main/java sẽ được biên soạn bởi các maven-biên dịch-plugin và nó mục tiêu là: biên dịch trong khi mã kiểm tra src/kiểm tra/java sẽ được biên dịch cũng bởi maven-compiler- plugin nhưng với mục tiêu của nó: testCompile.

Nếu bạn có phụ thuộc khác nhau để thử nghiệm và sản xuất do bạn có thể định nghĩa một phạm vi cùng với các phụ thuộc như thế này:

<dependency> 
    <groupId>org.testng</groupId> 
    <artifactId>testng</artifactId> 
    <version>6.2.1</version> 
    <scope>test</scope> 
    </dependency> 

điều đó có nghĩa đây sẽ là chỉ sử dụng được trong vòng mã vùng thử nghiệm và sẽ không được đóng gói. Nếu bạn không xác định phạm vi:

<dependency> 
    <groupId>org.testng</groupId> 
    <artifactId>testng</artifactId> 
    <version>6.2.1</version> 
    </dependency> 

Đây là một sự phụ thuộc được sử dụng phục vụ sản xuất và sẽ được đóng gói nếu bạn có một loại packging như "cuộc chiến" vv

Tôi đã thấy một điều như thế này mà tôi giả định là một typo:

<dependencies> 
    <dependency> 
     <groupId>com.company</groupId> 
     <artifactId>modulex</artifactId> 
     <version>${product.version}-SNAPSHOT</version> 
    </dependency> 
</dependencies> 

mà chỉ đơn giản là sai, nguyên nhân bạn phải sử dụng:

<dependencies> 
     <dependency> 
      <groupId>com.company</groupId> 
      <artifactId>modulex</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
    </dependencies> 

Các $ {} product.version không được xác định và bạn nên sử dụng $ {project.version} thay thế !!

Tôi khuyên bạn nên không để nhảy hai cấp độ trong một bước duy nhất ... Bạn nên thay đổi cấu trúc của dự án của bạn như thế này:

/ 
+- pom.xml 
+- module1/ 
    +- pom.xml 
    +-- module1-src 
     +- pom.xml 
     +- src/main/java 
      +- com/ 
       +- company/ 
       +- Module1.java 
    +-- module1-test 
     +- pom.xml 
     +- src/ 
      +- com/ 
      +- company/ 
       +- Module1Test.java 
... 

Dựa trên cấu trúc trên, bạn sẽ có được những thứ như:

<modules> 
    <module>module1</module> 
    <module>module2</module> 
    ... 
    <module>moduleN</module> 
</modules> 

và trong module1:

<modules> 
    <module>module1-src</module> 
    <module>module1-test</module> 
</modules> 

cách khác trừ e bạn bắt đầu chiến đấu chống lại Maven, nơi bạn sẽ mất chiến đấu.

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