Bir ana POM'daki bir profil için önceden tanımlanmış bir eklentinin yapılandırmasını geçersiz kılmak mümkün müdür?


110

Projemin bir POM üst dosyasında, bu proje için yararlı olan bazı yapılandırmaları tanımlayan böyle bir profilim var (böylece bu ana POM'dan kurtulamam):

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

Ancak projemde, test sınıflarını derlemek için jdk4 yerine jdk5 kullanmak için maven-derleyici eklentisinin yapılandırmasını geçersiz kılmak istiyorum.

Bu yüzden projemin POM'unda şu bölümü yaptım:

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

ve çalışmıyor ...

Hatta POM'umun normal eklenti bölümlerindeki yapılandırmayı geçersiz kılmaya bile çalıştım (yani, belirli bir profil için değil, tüm POM'um için).

Sorun ne olabilir?

Gereksinimlerimden bazılarını açıklığa kavuşturmak için:

  • Ana POM'dan ve içinde tanımlanan profilden (wls7) kurtulmak istemiyorum (çünkü birçok özelliğe, konfigürasyona, ... ihtiyacım olduğu için) ve bu benim şirketimdeki süreç değil.
  • Ana POM ve / veya içinde tanımlanan profilin kopyalanmasına dayalı bir çözüm iyi bir çözüm değildir. Çünkü
    ebeveyn POM sorumlusu bir şeyi değiştirirse,
    bunu benimkinde rapor etmem gerekir.

Bu sadece bir miras meselesi (bir profili genişletme veya geçersiz kılma, üst düzey bir POM'dan bir konfigürasyon) bu yüzden Maven 2 ile mümkün olması gerektiğini düşünüyorum.


Wls7 profili nasıl etkinleştirilir?
Pascal Thivent

Wls7 ve wls10 profillerinin her ikisi de üst POM'da "activeByDefault" dur. Ancak müşteri ihtiyaçlarına göre, yalnızca wls10 veya her ikisi komut dosyaları tarafından oluşturulur ("-P" parametresiyle)
Guillaume Cernier

Yanıtlar:


145

Bir ana ponponun konfigürasyonlarının geçersiz kılınması, ponponuzdaki combine.self="override"elemente nitelik eklenerek yapılabilir .

Eklenti yapılandırmanızı şu şekilde değiştirmeyi deneyin:

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

Eklentileri geçersiz kılma hakkında daha fazla bilgi için bkz: http://maven.apache.org/pom.html


Görünüşe göre Maven2.2.1 için bunu bir profilde yaparsanız, ana profillerde tanımlanan eklentilerle birleşmez, ancak onları geçersiz kılar. Aynı eklentiyi doğrudan derleme bölümünde tanımlarsanız çalışır. Maven3 için beklendiği gibi çözüldü.
Greg Domjan 13

Benim için işe yaramadı. Jenkins NodeJS Plugin v1.0'ı, Maven 3.3.9 kullanarak pom.xml'de org.jenkins-ci.plugins 1.580.1 sürümüyle yeniden oluşturmak istedim. ~ / .M2 / repository / org / jenkins-ci / jenkins / 1.34 / jenkins-1.34.pom içindeki <source> değerini manuel olarak 1.7 olarak değiştirene kadar hiçbir şey işe yaramadı.
Alexander Samoylov

6

ben de aynı sorunu yaşadım. Varsayılan olarak, maven war eklentim bir html dosyasını hariç tuttu. Ama kabul testleri profilime bu dosyanın dahil edilmesini istedim. Bu yüzden maven savaş eklentisini tekrar eklediğimde varsayılanı geçersiz kılmadı.

Bu sorunu çözmek için comb.self özniteliğini geçtim ve iyi çalıştım.

Varsayılan yapı:

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

Kabul testi profili:

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

1

Wls7 profilini devre dışı bırakmayı denediniz mi (maven 2.0.10'dan beri):

Maven 2.0.10'dan başlayarak, bir veya daha fazla profil, komut satırını kullanarak tanımlayıcılarının önüne '!' Karakteri eklenerek devre dışı bırakılabilir. veya '-' aşağıda gösterildiği gibi:

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

Bu, activeByDefault olarak işaretlenen profilleri veya normalde aktivasyon yapılandırmaları aracılığıyla etkinleştirilecek profilleri devre dışı bırakmak için kullanılabilir.

Ve ardından yapılandırmanızı farklı bir ada sahip bir profile veya doğrudan pom.xml.


Yukarıda da söylediğim gibi, çerçevede farklı seviyelerde tüm şirketim için tanımlanmış birçok konfigürasyonu miras aldığım için ana POM'dan kurtulamıyorum. Ve profillerin çoğaltılması iyi bir fikir olmamalıdır, çünkü ana POM'daki değişiklikleri bildirmem gerekir ve çoğu zaman bunların farkında değilim. Sadece projemdeki test sınıflarının derlenmesi için davranışı geçersiz kılmak istiyorum.
Guillaume Cernier

Cevabımı tekrar oku, önerdiğim bu değil. Ana POM'dan kurtulmak için bir profili devre dışı bırakmayı önerdim. Öyleyse neden ana ponpondaki değişiklikleri rapor etmelisiniz? Hiçbir şey sizi bunu yapmaya zorlamaz.
Pascal Thivent

Evet Pascal, yardımınız için teşekkürler, ancak sorun şu ki, wls7 profilini devre dışı bırakırsam, birçok konfigürasyondan kurtulurum (diğer eklentiler için, genel şeyler, ...) hala ihtiyacım var. Ve değişiklikleri bildirmekle, ana POM'DAN POM'uma demek istedim. Çünkü, önerdiğiniz çözümle, tüm ana POM'u kopyalamam gerekecek (test sınıflarının derlenmesi bölümü hariç) ve sorumlu ebeveyn POM, POM'unda bir şeyi değiştirirse, herhangi bir değişiklik konusunda uyarılmam gerekir. mevcut süreç değil ve çok pratik değil.
Guillaume Cernier

Ohh, tamam, şimdi anladım. Bununla birlikte, emin değilim (ama yanılıyor olabilirim) bir pomu kısmen geçersiz kılabilirsiniz, böylece sağlanan ayrıntılarla daha iyi bir çözümüm olmaz.
Pascal Thivent

Her neyse, Pascal'a bana yardım etmeye çalıştığı için çok teşekkürler. Aslında, belirli bir sebepten dolayı böyle bir davranışa ihtiyacım var. Belki bunu gerçekleştirmenin başka bir yolu vardır:
Guillaume Cernier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.