Можно ли переопределить конфигурацию плагина, уже определенного для профиля в родительском POM?

110

В родительском файле 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-compiler-plugin, чтобы использовать 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 что-то изменит, мне
    придется сообщить об этом в своем.

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

Гийом Сернье
источник
Как активируется профиль wls7?
Паскаль Тивент,
Профили wls7 и wls10 оба являются «activeByDefault» в родительском POM. Но в соответствии с потребностями клиентов только wls10 или оба они построены с помощью скриптов (с параметром «-P»)
Гийом Сернье

Ответы:

145

Переопределение конфигураций из родительского 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 это разрешилось, как и ожидалось.
Грег Домьян 01
У меня не получилось. Я хотел пересобрать Jenkins NodeJS Plugin v1.0 с версией 1.580.1 org.jenkins-ci.plugins в pom.xml, используя Maven 3.3.9. Пока я вручную не изменил <source> на 1.7 в ~ / .m2 / repository / 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, и чаще всего я не знаю о них. Я просто хотел бы переопределить поведение только для компиляции тестовых классов в моем проекте.
Guillaume Cernier
Перечитайте мой ответ, я не это предлагал. Я предложил деактивировать профиль, чтобы не избавляться от родительского POM. Тогда зачем вам сообщать об изменениях в родительском pom? Ничто не заставляет вас это делать.
Паскаль Тивент
Да, Паскаль, спасибо за вашу помощь, но проблема в том, что если я деактивирую профиль wls7, я избавлюсь от многих настроек (для других плагинов, общих вещей maven ...), которые мне все еще нужны. И, сообщая об изменениях, я имел в виду ОТ родительского POM К моему POM. Поскольку с предложенным вами решением мне нужно было бы продублировать все родительские POM (за исключением раздела для компиляции тестовых классов), и если родительский POM, ответственный за что-то, изменит что-то в его POM, мне нужно предупредить о любых изменениях, которые не текущий процесс и не очень практичный.
Guillaume Cernier
Ох, хорошо, теперь я понял. Однако я не уверен (но могу ошибаться), что вы можете частично переопределить pom, поэтому у меня нет лучшего решения с предоставленными деталями.
Паскаль Тивент
В любом случае, большое спасибо Паскалю за попытку мне помочь. На самом деле мне такое поведение нужно по особой причине. Может быть, есть другой способ исполнить это:
Гийом Сернье