Плагин Maven-Enforcer и пингвин

Я пытаюсь использовать плагин maven-forcecer, чтобы убедиться, что один профиль активирован (правило requireActiveProfile). Смотрите второй пример на этой странице: Требуется активный профиль

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

Я имею представление, почему это не работает?


Полный пример:

EXAMPLE
|   pom.xml <1> (parent pom)
|
\---child
        pom.xml <2> (child pom)

Родительский файл pom <1>:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app.parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <profiles>
    <profile>
      <id>first</id>
      <properties>
        <my-name>Alice</my-name>
      </properties>
    </profile>
    <profile>
      <id>second</id>
      <properties>
        <my-name>Bob</my-name>
      </properties>
    </profile>
  </profiles>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.4.1</version>
        <executions>
          <execution>
            <id>enforce-first-or-second-profile-is-active</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireActiveProfile>
                  <profiles>first,second</profiles>
                  <all>false</all>
                </requireActiveProfile>
              </rules>
              <fail>true</fail>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>run</goal>
            </goals>
            <configuration>
              <tasks>
                <echo>Hello ${my-name}!</echo>
              </tasks>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Детский файл пом <2>:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app.parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>my-app</artifactId>
  <packaging>pom</packaging>

</project>

Теперь я бегу:

EXAMPLE>cd child
EXAMPLE\child>mvn compile -Psecond

И вывод выглядит так:

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building my-app 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-first-or-second-profile-is-active) @ my-app ---
[WARNING] Rule 0: org.apache.maven.plugins.enforcer.RequireActiveProfile failed with message:
Profile "first" is not activated.
Profile "second" is not activated.

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.178 s
[INFO] Finished at: 2015-10-30T18:03:50+01:00
[INFO] Final Memory: 24M/989M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:1.4.1:enforce (enforce-first-or-second-profile-is-active) on project my-app: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

Когда я запускаю Maven на родительском пом, это работает. Что я упустил?

1 ответ

Решение

Профили Maven немного сбивают с толку, но я рискну объяснить, основываясь на моем опыте.

Определения профиля не наследуются, но эффект от них есть.

Если вы прыгаете на child каталог и запустить mvn -Pfirst help:active-profiles вы увидите, что эффект родительского профиля действительно есть:

Часть вывода:

...
<properties>
  <my-name>Alice</my-name>
</properties>
...

но вы не увидите там определения профилей.

Плохая новость в том, что ваш enforcer Правило не будет работать в этом сценарии, если каждый дочерний элемент также не определяет необходимые профили.

Хорошей новостью является то, что, вооружившись этими новыми знаниями, вы можете использовать другой enforcer правило (requireProperty) чтобы достичь того, что вы хотите:

   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.4.1</version>
    <executions>
      <execution>
        <id>enforce-property</id>
        <goals>
          <goal>enforce</goal>
        </goals>
        <configuration>
          <rules>
            <requireProperty>
              <property>my-name</property>
              <message>You must set a my-name property! Did you activate the right profile?</message>
            </requireProperty>
          </rules>
          <fail>true</fail>
        </configuration>
      </execution>
    </executions>
  </plugin>
Другие вопросы по тегам