Apakah mungkin untuk mengganti konfigurasi plugin yang sudah ditentukan untuk profil di POM induk?

110

Dalam file induk POM dari proyek saya, saya memiliki profil yang mendefinisikan beberapa konfigurasi yang berguna untuk proyek ini (sehingga saya tidak dapat menyingkirkan POM induk ini):

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

Tetapi dalam proyek saya, saya hanya ingin mengganti konfigurasi maven-compiler-plugin untuk menggunakan jdk5 dan bukan jdk4 untuk mengompilasi kelas uji.

Itulah mengapa saya melakukan bagian ini di POM proyek saya:

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

dan itu tidak bekerja ...

Saya bahkan mencoba menimpa konfigurasi di bagian plugin reguler POM saya (maksud saya, bukan untuk profil tertentu tetapi untuk keseluruhan POM saya).

Apa masalahnya?

Untuk memperjelas beberapa persyaratan saya:

  • Saya tidak ingin menyingkirkan POM induk dan profil (wls7) yang ditentukan di dalamnya (karena saya memerlukan banyak dan banyak properti, konfigurasi, ...) dan itu bukan proses di perusahaan saya.
  • Solusi yang didasarkan pada penggandaan POM induk dan / atau profil yang ditentukan di dalamnya bukanlah solusi yang baik. Karena jika penanggung jawab
    Badan POM induk mengubah sesuatu, saya
    harus melaporkannya di milik saya.

Ini hanya masalah warisan (memperpanjang atau menimpa profil, konfigurasi dari POM tingkat atas) jadi saya pikir itu harus dimungkinkan dengan Maven 2.

Guillaume Cernier
sumber
Bagaimana cara mengaktifkan profil wls7?
Pascal Thivent
Profil wls7 dan wls10 keduanya "activeByDefault" di POM induk. Tetapi sesuai kebutuhan pelanggan, hanya wls10 atau keduanya yang dibangun oleh skrip (dengan parameter "-P")
Guillaume Cernier

Jawaban:

145

Konfigurasi utama dari pom induk dapat dilakukan dengan menambahkan combine.self="override"atribut ke elemen di pom Anda.

Coba ubah konfigurasi plugin Anda menjadi:

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

Untuk informasi lebih lanjut tentang mengganti plugin, lihat: http://maven.apache.org/pom.html

Rolf
sumber
Tampaknya untuk Maven2.2.1 jika Anda melakukan ini di profil, ia tidak bergabung dengan plugin yang ditentukan di profil induk tetapi menimpanya. Jika Anda mendefinisikan plugin yang sama secara langsung di bagian build, itu berfungsi. Untuk Maven3, penyelesaiannya seperti yang diharapkan.
Greg Domjan
Itu tidak berhasil untuk saya. Saya ingin membangun kembali Jenkins NodeJS Plugin v1.0 dengan versi 1.580.1 dari org.jenkins-ci.plugins di pom.xml menggunakan Maven 3.3.9. Sampai saya secara manual mengubah <source> menjadi 1.7 di ~ / .m2 / repository / org / jenkins-ci / jenkins / 1.34 / jenkins-1.34.pom tidak ada yang berhasil.
Alexander Samoylov
6

saya memiliki masalah yang sama. Secara default plugin maven war saya tidak menyertakan file html. Tetapi dalam profil tes penerimaan saya, saya ingin file ini disertakan. Jadi ketika saya menambahkan plugin maven war lagi itu tidak menimpa default.

Untuk mengatasi masalah ini saya melewati atribut gabungkan.self dan bekerja dengan baik.

Bangun default:

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

Profil uji penerimaan:

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

Apakah Anda mencoba untuk menonaktifkan profil wls7 (sejak maven 2.0.10):

Dimulai dengan Maven 2.0.10, satu atau lebih profil dapat dinonaktifkan menggunakan baris perintah dengan mengawali pengenalnya dengan karakter '!' atau '-' seperti yang ditunjukkan di bawah ini:

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

Ini dapat digunakan untuk menonaktifkan profil yang ditandai sebagai activeByDefault atau profil yang sebaliknya akan diaktifkan melalui konfigurasi aktivasi mereka.

Dan kemudian tambahkan konfigurasi Anda di profil dengan nama yang berbeda atau langsung di file pom.xml.

Pascal Thivent
sumber
Seperti yang saya katakan di atas, saya tidak dapat menyingkirkan POM induk karena saya mewarisi banyak konfigurasi yang ditentukan untuk semua perusahaan saya di tingkat yang berbeda dalam kerangka kerja. Dan menduplikasi profil bukanlah ide yang baik, karena saya perlu melaporkan perubahan di Badan POM induk dan paling sering saya tidak menyadarinya. Saya hanya ingin mengganti perilaku hanya untuk kompilasi kelas uji dalam proyek saya.
Guillaume Cernier
Baca ulang jawaban saya, bukan itu yang saya sarankan. Saya menyarankan untuk menonaktifkan profil, bukan menyingkirkan Badan POM induk. Lalu, mengapa Anda harus melaporkan perubahan pada pom induk? Tidak ada yang memaksa Anda untuk melakukan itu.
Pascal Thivent
Ya Pascal, terima kasih atas bantuan Anda, tetapi masalahnya adalah jika saya menonaktifkan profil wls7 saya menyingkirkan banyak konfigurasi (untuk plugin lain, hal-hal umum maven, ...) saya masih perlu. Dan dengan melaporkan perubahan, maksud saya DARI POM induk KE POM saya. Karena, dengan solusi yang Anda sarankan, saya perlu menduplikasi semua POM induk (kecuali untuk bagian kompilasi kelas uji) dan jika POM induk yang bertanggung jawab mengubah sesuatu di POM-nya, saya perlu memperingatkan setiap perubahan yang terjadi. bukan proses saat ini dan tidak terlalu praktis.
Guillaume Cernier
Ohh, oke, saya mengerti sekarang. Namun, saya tidak yakin (tetapi saya mungkin salah) Anda dapat mengganti sebagian pom jadi saya tidak memiliki solusi yang lebih baik dengan detail yang diberikan.
Pascal Thivent
Bagaimanapun, terima kasih banyak Pascal karena telah mencoba membantu saya. Sebenarnya, saya membutuhkan perilaku seperti itu karena alasan tertentu. Mungkin ada cara lain untuk melakukannya:
Guillaume Cernier