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

В родительском файле 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.


person Guillaume Cernier    schedule 20.11.2009    source источник
comment
Как активируется профиль wls7?   -  person Pascal Thivent    schedule 23.11.2009
comment
Профили wls7 и wls10 оба активны по умолчанию в родительском POM. Но в соответствии с потребностями клиента только wls10 или оба создаются с помощью скриптов (с параметром -P).   -  person Guillaume Cernier    schedule 24.11.2009


Ответы (3)


Переопределение конфигураций из родительского 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

person Rolf    schedule 14.11.2011
comment
Похоже, что для Maven2.2.1, если вы делаете это в профиле, он не объединяется с плагинами, определенными в родительских профилях, а переопределяет их. Если вы определите тот же плагин непосредственно в разделе сборки, он будет работать. Для Maven3 это разрешилось, как и ожидалось. - person Greg Domjan; 01.03.2013
comment
У меня не получилось. Я хотел пересобрать 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, ничего не работало. - person Alexander Samoylov; 16.06.2020

Я была такая же проблема. По умолчанию мой плагин 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>
person shane lee    schedule 17.09.2013

Вы пытались деактивировать профиль wls7 (начиная с maven 2.0.10):

Начиная с Maven 2.0.10, один или несколько профилей можно деактивировать с помощью командной строки, добавив к их идентификатору префикс символа '!' или '-', как показано ниже:

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

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

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

person Pascal Thivent    schedule 20.11.2009
comment
Как я уже сказал выше, я не могу избавиться от родительского POM, поскольку я наследую множество конфигураций, определенных для всей моей компании на разных уровнях во фреймворке. И дублирование профилей не должно быть хорошей идеей, потому что мне нужно будет сообщать об изменениях в родительском POM, и чаще всего я о них не знаю. Я просто хотел бы переопределить поведение только для компиляции тестовых классов в моем проекте. - person Guillaume Cernier; 23.11.2009
comment
Перечитайте мой ответ, я не это предлагал. Я предложил деактивировать профиль, чтобы не избавляться от родительского POM. Тогда зачем вам сообщать об изменениях в родительском помпе? Ничто не заставляет вас это делать. - person Pascal Thivent; 23.11.2009
comment
Да, Паскаль, спасибо за вашу помощь, но проблема в том, что если я деактивирую профиль wls7, я избавлюсь от многих настроек (для других плагинов, общих вещей maven ...), которые мне все еще нужны. И, сообщая об изменениях, я имел в виду ОТ родительского POM К моему POM. Поскольку с предложенным вами решением мне нужно будет продублировать все родительские POM (за исключением раздела для компиляции тестовых классов), и если ответственный родительский POM что-то изменит в своем POM, мне нужно предупредить о любых изменениях, которые не текущий процесс и не очень практичный. - person Guillaume Cernier; 23.11.2009
comment
Ох, хорошо, теперь я понял. Однако я не уверен (но могу ошибаться), что вы можете частично переопределить pom, поэтому у меня нет лучшего решения с предоставленными деталями. - person Pascal Thivent; 23.11.2009
comment
В любом случае, большое спасибо Паскалю за попытку мне помочь. На самом деле мне такое поведение нужно по особой причине. Может есть другой способ выполнить это: - person Guillaume Cernier; 23.11.2009
comment
В процессе сборки продукта в моей компании создаются 2 выхода: один для Weblogic7 / Java1.4, а другой для Weblogic10 / Java5 (поэтому 2 профиля wls7 и wls10). Но для целей модульного тестирования я использую фреймворк JMockit, работающий только на Java 5+. Это не должно быть проблемой, поскольку требования Java4 к профилю wls7 нужны только для времени выполнения, а не для компиляции и выполнения тестов. Я пытался настроить только maven-compiler-plugin в моем POM, но, похоже, он игнорируется, и активный профиль никогда не отменяется. - person Guillaume Cernier; 23.11.2009
comment
Да, я догадался, что вы пытались сделать, но, к сожалению, мой лучший ответ: если профиль wls7 не соответствует вашим потребностям, не используйте его (может быть лучшее решение, но, поскольку я не знаю как активируется профиль wls7, все варианты описать не могу). - person Pascal Thivent; 23.11.2009