2011-10-17 17 views
36

Tôi có dự án đa mô-đun maven (cậu bé, tôi đã viết rằng mở cách quá nhiều lần trên trang web này). Hầu hết tất cả các mô-đun (có nghĩa là, các mô-đun có mã trong chúng) sẽ chạy plugin maven-site để tạo báo cáo về phạm vi mã, v.v ... Có cấu hình được chia sẻ chi tiết - báo cáo chạy, tệp nào để bao gồm/loại trừ đối với một số plugin nhất định, v.v.Trong một dự án đa mô-đun Maven, làm thế nào tôi có thể vô hiệu hóa một plugin trong một đứa trẻ?

Tuy nhiên, có một vài mô-đun xử lý việc đóng gói - chạy plugin lắp ráp để tạo tarball, v.v ... Không có gì từ việc chạy báo cáo trang web - không có mã để phân tích, không có thử nghiệm để báo cáo.

Vì vậy, tôi có rất nhiều module cần phần cấu hình Plugin, và một vài mô-đun cần không chạy plugin, tốt nhất là ở tất cả. Tôi có thể làm việc trước đây (chia sẻ cấu hình) nếu tôi đặt các plugin trong phần <build> của POM cha mẹ, nhưng tôi dường như không thể tắt plugin khi tôi cần trong trường hợp này. Tôi có thể làm thứ hai (tránh chạy các plugin) nếu tôi đẩy cấu hình xuống POM của mỗi module, nhưng tôi không thể tìm ra cách tốt để chia sẻ thông tin cấu hình trong trường hợp này.

Là những gì tôi muốn - cấu hình được chia sẻ, cho một plugin đôi khi bị vô hiệu hóa bởi mô-đun con - thậm chí có thể? Nếu vậy, làm thế nào?

Trả lời

61

Bằng cách "chạy plugin", tôi giả sử bạn có nghĩa là plugin được liên kết với giai đoạn vòng đời và bạn muốn hủy liên kết trong một số mô-đun. Đầu tiên, bạn có thể xem xét việc thay đổi thừa kế POM của bạn để các mô-đun không cần các plugin có một phụ huynh và các mô-đun có bố mẹ khác. Nếu bạn không muốn làm điều đó, sau đó bạn có thể đặt rõ ràng giai đoạn thực hiện thành "không có gì" trong một mô-đun con. Ví dụ. nếu bạn đã có một cấu hình mẹ pom như thế này:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <id>i-do-something</id> 
      <phase>initialize</phase> 
      <goals> 
       <goal>exec</goal> 
      </goals> 
      <configuration> 
       ... lots of configuration 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Sau đó, trong một module con, bạn có thể làm điều này:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>exec-maven-plugin</artifactId> 
    <version>1.2.1</version> 
    <executions> 
     <execution> 
      <id>i-do-something</id> 
      <phase/> 
     </execution> 
    </executions> 
</plugin> 

Bởi vì đó là cùng một plugin và id thực hiện tương tự, nó sẽ ghi đè các cấu hình được chỉ định trong phụ huynh và bây giờ plugin không bị ràng buộc vào một giai đoạn trong dự án con.

+1

Tuyệt vời, tôi biết nó sẽ giống như thế, nhưng tôi vẫn thuộc loại thắt lưng màu vàng (trong trường hợp bạn không đoán được từ dấu vết của câu hỏi Maven trong lịch sử gần đây của tôi). Tôi không thể di chuyển các dự án cho các bậc cha mẹ khác nhau vì [this] (http://stackoverflow.com/questions/7589931/how-should-i-share-maven-depdendencymanagement-from-multiple-sources), nhưng tôi sẽ unbind plugin báo cáo. Cảm ơn! – Coderer

+4

Cách tiếp cận này không hoạt động nếu không có '' được chỉ định cho plugin trong mô-đun chính. – EvgeniySharapov

+5

@evgeniysharapov Bạn vẫn có thể sử dụng ' none 'trong mô-đun con trong trường hợp đó, xem [câu trả lời này] (http://stackoverflow.com/a/14653088/1155724). –

1

Câu trả lời của Ryan Stewart hoạt động nếu thực thi mà bạn muốn chặn trong pom gốc được gắn thẻ với số id. Tuy nhiên, nếu pom mẹ không gắn thẻ thực thi với một số id (và dĩ nhiên, bạn không thể chỉnh sửa pom mẹ đó) thì tôi nhận thấy rằng làm như sau sẽ ngăn chặn hành động của cha mẹ.

  1. set đầu tiên giai đoạn của việc thực hiện để none
  2. Tạo thi công khác, cung cấp cho nó một id và làm trong nó những gì bạn cần nó để làm.
  3. chạy mvn help:effective-pom để xác nhận rằng nó đã chặn chính xác những gì bạn cần bị chặn khỏi pom mẹ.

Dưới đây là một ví dụ: Đây là cách pom mẹ tôi trông giống như:

<plugin> 
     <artifactId>maven-source-plugin</artifactId> 
     <version>2.1.2</version> 
     <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
      <goal>jar</goal> 
      </goals> 
     </execution> 
     </executions> 
     <inherited>true</inherited> 
    </plugin> 

tôi cần phải thay đổi mục tiêu để jar-no-fork.Lưu ý rằng việc thực hiện trong pom mẹ không có một id mà tôi có thể sử dụng để vô hiệu hóa nó. Vì vậy, đây là những gì bổ sung cho con pom của tôi:

  <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-source-plugin</artifactId> 
       <executions> 
        <execution> 
         <phase>none</phase> 
        </execution> 
        <execution> 
         <id>attach-sources</id> 
         <goals> 
          <goal>jar-no-fork</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 

Do vậy đây là cách hiệu quả-pom trông giống như:

 <plugin> 
     <artifactId>maven-source-plugin</artifactId> 
     <version>2.2.1</version> 
     <executions> 
      <execution> 
      <phase>none</phase> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      <configuration> 
       <archive> 
       <compress>false</compress> 
       </archive> 
      </configuration> 
      </execution> 
      <execution> 
      <id>attach-sources</id> 
      <goals> 
       <goal>jar-no-fork</goal> 
      </goals> 
      <configuration> 
       <archive> 
       <compress>false</compress> 
       </archive> 
      </configuration> 
      </execution> 
     </executions> 
     <inherited>true</inherited> 
     <configuration> 
      <archive> 
      <compress>false</compress> 
      </archive> 
     </configuration> 
     </plugin> 

này đảm bảo rằng mục tiêu jar không bao giờ chạy và chỉ có mục tiêu jar-no-fork thực thi - đó là điều tôi muốn đạt được.

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