Как активировать профиль Maven в зависимом модуле? - PullRequest
10 голосов
/ 20 августа 2010

Предположим, у меня есть модуль A:jar, время выполнения и набор зависимостей которого зависят от версии JDK. В моем примере у меня есть pre-jdk6-profile для JAXB API: до JDK 1.6.0 мне нужно было включить jaxb-api-nnn.jar в качестве зависимости компиляции. Этот профиль размещен на A.pom.

У меня также есть модуль B:war, который зависит от A:jar. Я хочу иметь возможность активировать этот профиль на сервере сборки для сборки JDK 1.5.x. Когда я запускаю Maven с активированным профилем, я получаю сообщение:

mvn -Ppre-jdk6-profile -o install
[WARNING]
        Profile with id: 'pre-jdk6-profile' has not been activated.

и jaxb-api-nnn.jar отсутствуют в результате B.war. Однако, если я активирую этот профиль при сборке из родительского pom.xml, все в порядке. Это означает, что профили не наследуются от зависимостей, и родительский многомодульный pom.xml смог построить все правильно, потому что кажется, что все профили объединены в реакторе.

Перенос профиля на родительский pom ухудшает ситуацию, поскольку зависимости применяются ко всем другим проектам (например, к C:ear). Есть ли хорошие решения для этой задачи, а именно: если какой-либо модуль A зависит от модуля B, то все зависимости компиляции и времени выполнения, которые активируются профилем, правильно обрабатываются?

Профиль в проекте A:jar:

<project ...>
    <artifactId>A</artifactId>
    <packaging>jar</packaging>
    ...
    <parent>
        <artifactId>P</artifactId>
        ...
    </parent>

    <profiles>
        <profile>
            <id>pre-jdk6-profile</id>

            <activation>
                <jdk>(,1.6.0)</jdk>
            </activation>

            <dependencies>
                <dependency>
                    <groupId>javax.xml.ws</groupId>
                    <artifactId>jaxws-api</artifactId>
                </dependency>
            </dependencies>
        </profile>
    </profiles>
...
</project>

Ответы [ 2 ]

11 голосов
/ 21 августа 2010

а) В многомодульной сборке вы всегда должны строить из верхней части модуля, а не из отдельного модуля. Если вы хотите собрать только один модуль, используйте дополнительные параметры реактора (см. Mvn --help), например:

mvn -pl mymodule

b) Определите и активируйте профиль в родительском pom, но добавьте конфигурацию в дочерний pom.

parent pom.xml

<profiles>
    <profile>
         <id>pre-jdk-6</id>
         <activation>
            <jdk>(,1.6.0)</jdk>
         </activation>
    </profile>
</profiles>

child pom.xml

<profiles>
    <profile>
        <id>pre-jdk-6</id>

        <dependencies>
            <dependency>
                <groupId>javax.xml.ws</groupId>
                <artifactId>jaxws-api</artifactId>
            </dependency>
        </dependencies>
    </profile>
</profiles>
4 голосов
/ 04 ноября 2016

Несколько примечаний после факта:

  1. Когда вы используете -P profName, он активирует профиль с именем 'profName'
  2. После этого он отключает все профили, которые имеют<activation> тег для них.Неважно, активированы ли они java-версией, как в примере, или по умолчанию, или значением env, или чем-то еще.
  3. Это означает, что -P приводит к тому, что любой другой активированный профиль становится деактивированным.

Решение: либо используйте <activation><jdk>...</jdk></activation>, либо используйте -P, но не используйте оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...