Czy można nadpisać konfigurację wtyczki już zdefiniowanej dla profilu w nadrzędnym POM?

110

W macierzystym pliku POM mojego projektu mam taki profil definiujący niektóre konfiguracje przydatne dla tego projektu (aby nie móc się pozbyć tego nadrzędnego 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>

Ale w moim projekcie chciałbym po prostu przesłonić konfigurację wtyczki maven-compiler-plugin, aby używać jdk5 zamiast jdk4 do kompilowania testów-klas.

Dlatego zrobiłem ten dział w POM mojego projektu:

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

i nie działa ...

Próbowałem nawet nadpisać konfigurację w zwykłych sekcjach wtyczki mojego POM (mam na myśli, nie dla określonego profilu, ale dla całego mojego POM).

Jaki może być problem?

Aby wyjaśnić niektóre z moich wymagań:

  • Nie chcę pozbywać się macierzystego POM i profilu (wls7) zdefiniowanego w nim (ponieważ potrzebuję wielu i wielu właściwości, konfiguracji, ...) i nie jest to proces w mojej firmie.
  • Rozwiązanie polegające na powielaniu macierzystego POM i / lub zdefiniowanego w nim profilu nie jest dobre. Skoro gdyby odpowiedzialna
    za rodzica POM coś zmieniła to
    musiałbym to zgłosić u siebie.

To tylko kwestia dziedziczenia (rozszerzenie lub zastąpienie profilu, konfiguracja z POM wyższego poziomu), więc myślę, że powinno to być możliwe z Maven 2.

Guillaume Cernier
źródło
Jak aktywowany jest profil wls7?
Pascal Thivent
Profile wls7 i wls10 są „activeByDefault” w nadrzędnym POM. Ale zgodnie z potrzebami klienta, tylko wls10 lub oba są budowane przez skrypty (z parametrem „-P”)
Guillaume Cernier

Odpowiedzi:

145

Nadpisywanie konfiguracji z macierzystego pom może być wykonane przez dodanie combine.self="override"atrybutu do elementu w pom.

Spróbuj zmienić konfigurację wtyczki na:

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

Więcej informacji na temat zastępowania wtyczek można znaleźć pod adresem : http://maven.apache.org/pom.html

Rolf
źródło
Wygląda na to, że w przypadku Maven 2.2.1, jeśli zrobisz to w profilu, nie łączy się z wtyczkami zdefiniowanymi w profilach nadrzędnych, ale je zastępuje. Jeśli zdefiniujesz tę samą wtyczkę bezpośrednio w sekcji kompilacji, zadziała. W przypadku Maven3 problem rozwiązał się zgodnie z oczekiwaniami.
Greg Domjan
Na mnie to nie wyszło. Chciałem przebudować Jenkins NodeJS Plugin v1.0 z wersją 1.580.1 org.jenkins-ci.plugins w pom.xml przy użyciu Maven 3.3.9. Dopóki ręcznie nie zmieniłem <source> na 1.7 w ~ / .m2 / repository / org / jenkins-ci / jenkins / 1.34 / jenkins-1.34.pom, nic nie działało.
Alexander Samoylov
6

miałem ten sam problem. Domyślnie moja wtyczka maven war wykluczyła plik HTML. Ale w moim profilu testów akceptacyjnych chciałem dołączyć ten plik. Więc kiedy ponownie dodałem wtyczkę maven war, nie nadpisała domyślnej.

Aby rozwiązać ten problem, przekazałem atrybut connect.self i działałem dobrze.

Kompilacja domyślna:

<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 testu akceptacji:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.4</version>
    <configuration combine.self="override"/>
</plugin>
Shane Lee
źródło
1

Czy próbowałeś dezaktywować profil wls7 (od maven 2.0.10):

Począwszy od Maven 2.0.10, jeden lub więcej profili można dezaktywować za pomocą wiersza poleceń, poprzedzając ich identyfikator znakiem „!” lub „-”, jak pokazano poniżej:

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

Można to wykorzystać do dezaktywacji profili oznaczonych jako activeByDefault lub profili, które w innym przypadku zostałyby aktywowane poprzez ich konfigurację aktywacji.

Następnie dodaj swoją konfigurację w profilu o innej nazwie lub bezpośrednio w swoim pom.xml.

Pascal Thivent
źródło
Jak powiedziałem powyżej, nie mogę pozbyć się macierzystego POM, ponieważ dziedziczę wiele konfiguracji zdefiniowanych dla całej mojej firmy na różnych poziomach we frameworku. A powielanie profili nie powinno być dobrym pomysłem, bo musiałbym zgłaszać zmiany w macierzystym POM i najczęściej nie jestem ich świadomy. Chciałbym tylko przesłonić zachowanie tylko przy kompilacji klas testowych w moim projekcie.
Guillaume Cernier
Przeczytaj ponownie moją odpowiedź, nie to sugerowałem. Zaproponowałem dezaktywację profilu, aby nie pozbywać się rodzica POM. Dlaczego więc miałbyś zgłaszać zmiany w pom-rodzicu? Nic cię do tego nie zmusza.
Pascal Thivent
Tak Pascal, dziękuję za pomoc, ale problem w tym, że jeśli dezaktywuję profil wls7 to pozbędę się wielu konfiguracji (dla innych wtyczek, ogólnych rzeczy maven, ...) nadal potrzebuję. A zgłaszając zmiany, miałem na myśli OD rodzica POM DO mojego POM. Ponieważ dzięki rozwiązaniu, które zasugerowałeś, musiałbym zduplikować wszystkie nadrzędne POM (poza sekcją dotyczącą kompilacji klas testowych) i jeśli rodzic odpowiedzialny POM zmieni coś w swoim POM, muszę być ostrzeżony o każdej zmianie, która jest nie jest to obecny proces i niezbyt praktyczny.
Guillaume Cernier
Och, ok, teraz rozumiem. Jednak nie jestem pewien (ale mogę się mylić) możesz częściowo zastąpić pom, więc nie mam lepszego rozwiązania z podanymi szczegółami.
Pascal Thivent
W każdym razie wielkie dzięki Pascalowi za próbę pomocy. W rzeczywistości potrzebuję takiego zachowania z określonego powodu. Może jest inny sposób na wykonanie tego:
Guillaume Cernier