2009-11-20 27 views
73

Trong một tệp cha mẹ POM của dự án của tôi không, tôi có một cấu hình xác định một số cấu hình hữu ích cho dự án này (để tôi có thể 't thoát khỏi cha mẹ này POM):Maven: Có thể ghi đè lên cấu hình của một plugin đã được xác định cho một cấu hình trong một phụ huynh POM

<profile> 
<id>wls7</id> 
... 
<build> 
    <plugins> 
    <!-- use java 1.4 --> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <configuration> 
     <fork>true</fork> 
     <source>1.4</source> 
     <target>1.4</target> 
     <meminitial>128m</meminitial> 
     <maxmem>1024m</maxmem> 
     <executable>%${jdk14.executable}</executable> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

... 
</profile> 

Nhưng trong dự án của tôi tôi chỉ muốn ghi đè lên cấu hình của maven-biên dịch-plugin để sử dụng jdk5 thay vì jdk4 cho biên soạn thử các lớp học.

Đó là lý do tại sao tôi đã làm phần này trong POM của dự án của tôi:

<profiles> 
    <profile> 
    <id>wls7</id> 
     <activation> 
      <property> 
       <name>jdk</name> 
       <value>4</value> 
      </property> 
     </activation> 
    <build> 
     <directory>target-1.4</directory> 
     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <executions> 
      <execution> 
       <id>my-testCompile</id> 
       <phase>test-compile</phase> 
       <goals> 
       <goal>testCompile</goal> 
       </goals> 
       <configuration> 
       <fork>true</fork> 
       <executable>${jdk15.executable}</executable> 
       <compilerVersion>1.5</compilerVersion> 
       <source>1.5</source> 
       <target>1.5</target> 
       <verbose>true</verbose> 
       </configuration> 
      </execution> 
      </executions> 
     </plugin> 
     </plugins> 
    </build> 
    </profile> 
       ... 
</profiles> 

và nó không làm việc ...

Tôi thậm chí đã cố gắng để ghi đè lên cấu hình trong phần Plugin thường xuyên của POM của tôi (Tôi có nghĩa là, không cho một hồ sơ cụ thể nhưng đối với toàn bộ POM của tôi).

Điều gì có thể là vấn đề?

Để làm rõ một số yêu cầu của tôi:

  • Tôi không muốn để thoát khỏi cha mẹ POM và hồ sơ cá nhân (wls7) được xác định bên trong nó (kể từ khi tôi cần nhiều và nhiều tài sản, cấu hình, ...) và không phải là quy trình trong công ty của tôi.
  • Một giải pháp dựa trên nhân bản POM mẹ và/hoặc cấu hình được xác định bên trong nó không phải là tốt một. Vì nếu chịu trách nhiệm
    POM phụ huynh thay đổi điều gì đó, tôi
    sẽ phải báo cáo điều đó trong của tôi.

Đó chỉ là vấn đề thừa kế (mở rộng hoặc ghi đè cấu hình, cấu hình từ POM cấp cao) vì vậy tôi nghĩ có thể với maven2.

+0

Làm thế nào là hồ sơ wls7 kích hoạt? –

+0

Các cấu hình wls7 và wls10 đều là "activeByDefault" trong POM cha. Nhưng theo nhu cầu của khách hàng, chỉ có wls10 hoặc cả hai đều được xây dựng bởi tập lệnh (với tham số "-P") –

Trả lời

1

Bạn có cố gắng tắt hồ sơ cá nhân wls7 (kể từ maven 2.0.10):

Bắt đầu với Maven 2.0.10, một hoặc hồ sơ hơn có thể bị ngừng hoạt động sử dụng dòng lệnh bằng cách đặt trước của họ số nhận dạng có ký tự '!' hoặc '-' như hình dưới đây:

mvn groupId:artifactId:goal -P !profile-1,!profile-2 

này có thể được sử dụng để tắt hồ sơ đánh dấu là activeByDefault hoặc hồ sơ nếu không sẽ được kích hoạt thông qua kích hoạt cấu hình của họ.

Sau đó thêm cấu hình của bạn vào một cấu hình có tên khác hoặc trực tiếp trong số pom.xml của bạn.

+0

Như tôi đã nói ở trên, tôi không thể loại bỏ POM mẹ vì tôi thừa hưởng nhiều cấu hình được xác định cho tất cả công ty của tôi tại các cấp độ khác nhau trong khuôn khổ. Và hồ sơ nhân bản không phải là một ý tưởng tốt, bởi vì tôi sẽ cần phải báo cáo những thay đổi trong POM cha mẹ và thường xuyên nhất tôi không nhận thức được chúng. Tôi chỉ muốn ghi đè hành vi chỉ cho việc biên soạn các lớp thử nghiệm trong dự án của tôi. –

+0

Đọc lại câu trả lời của tôi, đó không phải là những gì tôi đề nghị. Tôi đề nghị hủy kích hoạt một hồ sơ, không phải để loại bỏ POM cha mẹ. Sau đó, tại sao bạn phải báo cáo thay đổi trong pom cha mẹ? Không có gì buộc bạn phải làm điều đó. –

+0

Có Pascal, cảm ơn sự giúp đỡ của bạn, nhưng vấn đề là nếu tôi hủy kích hoạt hồ sơ wls7, tôi sẽ loại bỏ rất nhiều cấu hình (cho các plugin khác, công cụ chung, ...) Tôi vẫn cần. Và bằng cách báo cáo các thay đổi, tôi có nghĩa là TỪ POM mẹ ĐẾN POM của tôi. Bởi vì, với giải pháp bạn đề nghị, tôi sẽ cần phải sao chép tất cả các POM cha mẹ (trừ phần để biên soạn các lớp kiểm tra) và nếu POM phụ trách thay đổi điều gì đó trong POM của mình, tôi cần phải cảnh báo về bất kỳ thay đổi nào đó không phải là quá trình hiện tại và không thực tế lắm. –

105

Cấu hình ghi đè từ cha mẹ có thể được thực hiện bằng cách thêm thuộc tính combine.self="override" vào phần tử trong pom của bạn.

Hãy thử thay đổi cấu hình plugin của bạn để:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>my-testCompile</id> 
      <phase>test-compile</phase> 
      <goals> 
      <goal>testCompile</goal> 
      </goals> 
      <configuration combine.self="override"> 
      <fork>true</fork> 
      <executable>${jdk15.executable}</executable> 
      <compilerVersion>1.5</compilerVersion> 
      <source>1.5</source> 
      <target>1.5</target> 
      <verbose>true</verbose> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 

Để biết thêm thông tin về các plugin trọng, xem: http://maven.apache.org/pom.html

+0

Có vẻ như đối với Maven2.2.1 nếu bạn làm điều này trong một cấu hình, nó không hợp nhất với các plugin được xác định trong các cấu hình gốc nhưng ghi đè chúng.Nếu bạn xác định cùng một plugin trực tiếp trong phần xây dựng, nó hoạt động. Đối với Maven3 nó đã được giải quyết như mong đợi. –

2

tôi đã có cùng một vấn đề. Theo mặc định, plugin maven war của tôi đã loại trừ một tệp html. Nhưng trong hồ sơ chấp nhận kiểm tra của tôi, tôi muốn có tệp này. Vì vậy, khi tôi thêm vào trong các plugin chiến tranh maven một lần nữa nó đã không ghi đè lên mặc định.

Để giải quyết vấn đề này, tôi đã vượt qua thuộc tính combine.self và hoạt động tốt.

Mặc định xây dựng:

<plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>2.4</version> 
       <configuration> 
       <packagingExcludes>swagger-ui/client.html</packagingExcludes> 
       </configuration> 
      </plugin> 

Chấp nhận kiểm tra hồ sơ:

<plugin> 
         <groupId>org.apache.maven.plugins</groupId> 
         <artifactId>maven-war-plugin</artifactId> 
         <version>2.4</version> 
         <configuration combine.self="override"/> 
        </plugin> 
Các vấn đề liên quan