Có thể ghi đè cấu hình của một plugin đã được xác định cho một cấu hình trong POM mẹ không?


110

Trong tệp mẹ POM của dự án của tôi, tôi có một hồ sơ xác định một số cấu hình hữu ích cho dự án này (để tôi không thể loại bỏ POM mẹ này):

<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 đè cấu hình của maven-compiler-plugin để sử dụng jdk5 thay vì jdk4 để biên dịch các lớp thử nghiệm.

Đó là lý do tại sao tôi thực hiện phần này trong POM của dự án của mình:

<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 hoạt động ...

Tôi thậm chí đã cố gắng ghi đè cấu hình trong các phần plugin thông thường của POM của mình (ý tôi là, không phải cho một hồ sơ cụ thể mà cho 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 loại bỏ POM mẹ và hồ sơ (wls7) được xác định bên trong nó (vì tôi cần rất nhiều thuộc tính, 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 việc sao chép POM mẹ và / hoặc hồ sơ được xác định bên trong nó không phải là một giải pháp tốt. Vì nếu trách nhiệm của
    POM mẹ thay đổi điều gì đó, tôi
    sẽ phải báo cáo điều đó cho tôi.

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


Hồ sơ wls7 được kích hoạt như thế nào?
Pascal Thivent

Các cấu hình wls7 và wls10 đều là "activeByDefault" trong POM mẹ. Tuy nhiên, theo nhu cầu khách hàng, chỉ có wls10 hoặc cả hai được xây dựng bởi các kịch bản (với tham số "-P")
Guillaume Cernier

Câu trả lời:


145

Việc ghi đè các cấu hình từ một pom mẹ có thể được thực hiện bằng cách thêm combine.self="override"thuộc tính 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 thành:

    <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ề ghi đè plugin, hãy xem: http://maven.apache.org/pom.html


Có vẻ như đối với Maven2.2.1 nếu bạn thực hiện việc 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ấu hình mẹ mà 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ó sẽ hoạt động. Đối với Maven3, nó đã giải quyết như mong đợi.
Greg Domjan

Nó không làm việc cho tôi. Tôi muốn xây dựng lại Jenkins NodeJS Plugin v1.0 với phiên bản 1.580.1 của org.jenkins-ci.plugins trong pom.xml bằng Maven 3.3.9. Cho đến khi tôi thay đổi thủ công <source> thành 1.7 trong ~ / .m2 / repository / org / jenkins-ci / jenkins / 1.34 / jenkins-1.34.pom, không có gì hoạt động.
Alexander Samoylov

6

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

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

Bản dựng mặc định:

<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>

Hồ sơ nghiệm thu:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration combine.self="override"/>
</plugin>

1

Bạn đã thử hủy kích hoạt cấu hình wls7 (kể từ maven 2.0.10):

Bắt đầu với Maven 2.0.10, một hoặc nhiều cấu hình có thể bị hủy kích hoạt bằng dòng lệnh bằng cách đặt tiền tố định danh của chúng bằng ký tự '!' hoặc '-' như hình dưới đây:

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

Điều này có thể được sử dụng để hủy kích hoạt các cấu hình được đánh dấu là activeByDefault hoặc các cấu hình sẽ được kích hoạt thông qua cấu hình kích hoạt của chúng.

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


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

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

Vâng 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 (đối với các plugin khác, những thứ chung của maven, ...) Tôi vẫn cần. Và bằng cách báo cáo những thay đổi, ý tôi là TỪ POM gốc ĐẾN POM của tôi. Bởi vì, với giải pháp mà bạn đề xuất, tôi sẽ cần sao chép tất cả POM gốc (ngoại trừ phần biên dịch các lớp thử nghiệm) và nếu POM gốc chịu trách nhiệm thay đổi điều gì đó trong POM của mình, tôi cần được cảnh báo về bất kỳ thay đổi nào không phải là quy trình hiện tại và không thực tế lắm.
Guillaume Cernier

Ồ, được rồi, tôi hiểu rồi. Tuy nhiên, tôi không chắc (nhưng tôi có thể sai) bạn có thể ghi đè một phần pom nên tôi không có giải pháp nào tốt hơn với các chi tiết được cung cấp.
Pascal Thivent

Dù sao, rất cảm ơn Pascal đã cố gắng giúp tôi. Trong thực tế, tôi cần một hành vi như vậy bởi vì một lý do cụ thể. Có thể có một cách khác để thực hiện nó:
Guillaume Cernier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.