Чи можливо замінити конфігурацію плагіна, який уже визначений для профілю в батьківському POM?


109

У батьківському файлі POM мого проекту у мене є такий профіль, який визначає деякі конфігурації, корисні для цього проекту (так що я не можу позбутися цього батьківського 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>

Але в своєму проекті я просто хотів би змінити конфігурацію плагін maven-компілятор, щоб використовувати jdk5 замість jdk4 для складання тестових класів.

Ось чому я зробив цей розділ у програмі POM свого проекту:

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

і це не працює ...

Я навіть намагався змінити конфігурацію в звичайних розділах плагінів моєї POM (я маю на увазі не для конкретного профілю, а для всього мого POM).

У чому може бути проблема?

Щоб уточнити деякі мої вимоги:

  • Я не хочу позбуватися батьківського POM та профілю (wls7), визначеного всередині нього (оскільки мені потрібно багато і багато властивостей, конфігурацій, ...), і це не процес у моїй компанії.
  • Рішення, засноване на дублюванні батьківського POM та / або профілю, визначеного всередині нього, не є хорошим. Оскільки, якщо відповідальний з
    батьківського ПОМ щось змінить, мені
    доведеться повідомити про це.

Це лише питання спадкування (розширити або змінити профіль, конфігурація з POM верхнього рівня), тому я думаю, що це можливо для Maven 2.


Як активується профіль wls7?
Паскаль Thivent

Профілі wls7 та wls10 обидва є "activeByDefault" у батьківському POM. Але відповідно до потреб клієнтів, лише wls10 або обидва будуються за сценаріями (з параметром "-P")
Гійом Серньє

Відповіді:


144

Перевизначення конфігурацій з батьківського pom можна здійснити, додавши combine.self="override"атрибут до елемента вашого pom.

Спробуйте змінити конфігурацію плагіна на:

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

Для отримання додаткової інформації про перекриття плагінів див. Http://maven.apache.org/pom.html


Здається, що для Maven2.2.1, якщо ви робите це в профілі, він не зливається з плагінами, визначеними в батьківських профілях, але переосмислює їх. Якщо ви визначаєте той самий плагін безпосередньо в розділі збірки, він працює. Для Maven3 це вирішилось, як очікувалося.
Грег Дом’ян

Мені це не вийшло. Я хотів відновити плагін Jenkins NodeJS v1.0 з версією 1.580.1 з org.jenkins-ci.plugins у pom.xml за допомогою Maven 3.3.9. Поки я вручну не змінив <source> на 1.7 в ~ / .m2 / сховищі / org / jenkins-ci / jenkins / 1.34 / jenkins-1.34.pom, нічого не вийшло.
Олександр Самойлов

6

у мене було те саме питання. За замовчуванням мій плагін Maven war виключив файл HTML. Але в моєму профілі приймальних тестів я хотів, щоб цей файл був включений. Тож коли я знову додав плагін Maven war, він не змінив значення за замовчуванням.

Щоб вирішити цю проблему, я передав атрибут comb.self і працював чудово.

Збірка за замовчуванням:

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

Профіль тесту на прийняття:

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

1

Ви намагалися деактивувати профіль wls7 (з Maven 2.0.10):

Починаючи з Maven 2.0.10, один або кілька профілів можна деактивувати за допомогою командного рядка, поставивши їх ідентифікатор або символом '!' або "-", як показано нижче:

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

Це можна використовувати для деактивації профілів, позначених як activeByDefault, або профілів, які в іншому випадку будуть активовані через їх конфігурацію активації.

А потім додайте свою конфігурацію в профіль з іншим іменем або безпосередньо у своєму pom.xml.


Як я вже говорив вище, я не можу позбутися батьківського POM, оскільки я успадковую безліч конфігурацій, визначених для всієї моєї компанії на різних рівнях у рамках. І дублювання профілів не повинно бути гарною ідеєю, тому що мені потрібно було б повідомити про зміни в батьківській POM, і найчастіше я про них не знаю. Я просто хотів би змінити поведінку лише для складання тестових класів у своєму проекті.
Гійом Серньє

Прочитайте мою відповідь, це не те, що я запропонував. Я запропонував деактивувати профіль, а не позбавлятися від батьківського POM. Тоді чому б вам довелося повідомляти про зміни у батьківській пом? Ніщо не змушує вас це робити.
Паскаль Thivent

Так, Паскаль, дякую за вашу допомогу, але проблема полягає в тому, що якщо я деактивую профіль wls7, я позбудусь великої кількості конфігурації (для інших плагінів, Maven загальних речей, ...) мені все одно потрібно. І повідомляючи про зміни, я мав на увазі ВІД батьківського ПОМ до мого ПОМ. Тому що, за рішенням, яке ви запропонували, мені потрібно буде дублювати всі батьківські POM (за винятком розділу для складання тестових класів), і якщо відповідальний батьківський POM щось змінить у своєму POM, я повинен попередити про будь-які зміни, які є не поточний процес і не дуже практичний.
Гійом Серньє

Ой, гаразд, я розумію зараз. Однак я не впевнений (але я можу помилятися) ви можете частково змінити пом, тому я не маю кращого рішення з наданими деталями.
Паскаль Thivent

У будь-якому випадку, велике спасибі Паскалю за спробу допомогти мені. Насправді мені така поведінка потрібна через певну причину. Можливо, є інший спосіб виконати це:
Гійом Серньє
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.