2011-01-11 31 views
8

Tôi hiện đang đấu tranh với Maven: Tôi có một dự án phức tạp được tạo thành từ nhiều mô-đun lồng nhau và một số mô-đun đó, tôi có cấu hình tương tự trong POM.Làm thế nào để chia sẻ các mảnh POM giữa các POM khác nhau

Tôi muốn làm cho nó sạch sẽ. Trên thực tế, tôi muốn xác định một cấu hình chung "runnable-jar" và kích hoạt nó trong một số module.

Đây là mảnh POM Tôi muốn chia sẻ giữa một số dự án:

<build> 
    <plugins> 
     <plugin> 

     <artifactId>maven-assembly-plugin</artifactId> 
     <configuration> 

      <!-- Use a custom descriptor, with suffix "bin" --> 
      <descriptors> 
       <descriptor>src/main/assembly/runnable-jar-assembly.xml</descriptor> 
      </descriptors> 

      <!-- Add main class to manifest --> 
      <archive> 
       <manifest> 
        <mainClass>${mainClass}</mainClass> 
       </manifest> 
      </archive> 

     </configuration> 

     <!-- Add build of this package to lifecycle --> 
     <executions> 
      <execution> 
       <id>make-runnable-jar</id> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
      </execution> 
     </executions> 

     </plugin> 
    </plugins> 
</build> 

Trong một số POMS, tôi muốn để có thể làm điều gì đó như:

<!-- Set the main class --> 
<properties> 
    <mainClass>my.main.Class</mainClass> 
</properties> 

<!-- Activate runnable jar build --> 
<import>src/main/pom/runnable-jar-pom.xml</import> 

tôi đã tìm kiếm trung bình để nhập một số đoạn XML vào một POM hoặc để xác định toàn bộ macro nodeset XML.

Đối với những gì tôi đã tìm thấy, giải pháp gần nhất là xác định cấu hình trong POM mẹ và kích hoạt nó trong một số mô-đun phụ bằng cách kiểm tra sự hiện diện của tệp. See this related question. Nhưng tôi đang đối mặt với vấn đề thuộc tính {basedir} không được đặt chính xác được thừa kế/thiết lập.

Tôi thấy rất đáng ngạc nhiên khi cần phải hack để thực hiện điều gì đó cơ bản (= bình thường). Làm thế nào để bạn thường xử lý điều này trong Maven?

Trả lời

6

Tôi vừa phát hiện ra một cái gì đó mà có thể giải quyết vấn đề của tôi:

Một mô-đun không cần trở thành một mô-đun phụ của mô-đun chính.

Chánhsub-module mối quan hệ là những khái niệm riêng biệt.

Bạn có thể chỉ định một mô-đun mẹ POM đó không phải là thư mục mẹ thực tế trong cấu trúc thư mục của bạn, bằng cách sử dụng các relativePath thuộc tính (as explained in the doc)

Trong trường hợp của tôi, tôi sử dụng cách bố trí như sau:

  • chính dự án
    • utils (mẹ: chính dự án)
    • cli-chương trình (mẹ: chính dự án)
      • generic-cli (mẹ: cli-chương trình; Dummy & trống mô-đun POM)
      • cli-1 (mẹ: generic-cli)
      • cli-2 (mẹ: generic-cli)

Sau đó, trong generic-cli/pom.xml Tôi có thể khai báo cấu hình c ommon cho tất cả các chương trình cli của tôi (như các bộ kiểm tra tùy chỉnh, bao bì runnable-jar, vv).

0

không phải là câu trả lời hoàn chỉnh nhưng giải pháp cho vấn đề dựa trên là sử dụng bố cục chung của các mô-đun, ví dụ: root/modules/moduleA root/modules/moduleB.

Bạn không thể xây dựng các mô-đun tạo thành thư mục riêng của họ nữa, chỉ thông qua dự án phụ huynh. Nhưng bạn có thể làm việc với các cấu hình.

5

Một cách để thực hiện việc này là khai báo mã <plugin> bên trong <pluginManagement> của phụ huynh của dự án đa mô-đun của bạn. Các mô-đun riêng lẻ sau đó có thể có một phần <plugin> có thể sử dụng điều này mà không cần redeclaring nội dung.

pom phụ huynh:

<pluginManagement> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
       ... all the details... 
     </plugin> 
     ... 
    </plugins> 
</pluginManagement> 

poms Child:

 <plugins> 
     ... 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-assembly-plugin</artifactId> 
     </plugin> 
    </plugin> 
+0

Tốt. Tôi không nhận thức được khả năng đó. –

0

Maven-tiles giải quyết vấn đề này. Nó cũng nằm trên lộ trình cho maven 3.x, theo dõi here.

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