установка активного профиля, определенного в родительском pom в pom проекта

У нас есть общекорпоративный Super Pom, который мы используем для определения многих используемых нами значений по умолчанию. Например, Super Pom определяет используемую версию JDK и другие параметры. Это наследуется нашими проектами как родительский pom.

В большинстве наших проектов используется JDK 1.7, но один набор проектов все еще использует версию JDK 1.6. Я поместил следующие определения профиля в свой родительский pom:

<properties>
    <travelclick.snapshot.repo>artifactory/libs-snapshot-local</travelclick.snapshot.repo>
    <old.javac.source>1.5</old.javac.source>
    <old.javac.target>1.6</old.javac.target>
</properties>
<profiles>
    ...
    <profile>
        <id>jdk1.6</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>com.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.3</version>
                    <configuration>
                        <...>
                        <source>${old.javac.source}</source>
                        <target>${old.javac.target}</target>
                        <...>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
    <...>
</profiles>

Теперь у меня есть профиль с именем jdk1.6, и я хотел бы указать в pom проекта, что он должен использовать этот профиль по умолчанию. Как мне это сделать?

Я попытался добавить в pom проекта:

<profiles>
    <profile>
        <id>jdk1.6</id>
        <activations>
            <activeByDefault>true</activeByDefault>
        </activations>
    </profile>
</profile>

Но это переопределяет мой профиль jdk1.6.

Я пытался вставить это:

<activeProfiles>
   <activeProfile>jdk1.6</activeProfile>
</activeProfiles>

Но это работает только в settings.xml.

Как мне указать профиль в родительском pom, а затем сказать, что это активный профиль в дочернем pom?


Больше попыток

Я пробовал использовать свойства. В моем родительском файле pom.xml:

<profiles>
    <profile>
        <id>jdk1.6</id>
        <activation>
            <property>
                <name>use-jdk1.6</name>
            </property>
       </activation>
   <profile>
</profiles>

И следующее в моем локальном pom:

<properties>
     <use-jdk1.6>true</use-jdk1.6>
</properties>

Но он не поднимает профиль. И это работает:

$ mvn -Puse-jdk1.6 clean package site

Итак, я знаю, что родительские профили работают.


Профили

Не могли бы вы добавить данные своего профиля, выполнив цель help:all-profiles

[INFO] Listing Profiles for Project: xxxx
  Profile Id: artifactory (Active: true , Source: settings.xml)
  Profile Id: jdk1.6 (Active: false , Source: pom)
  Profile Id: arse-version (Active: false , Source: pom)
  Profile Id: urge (Active: false , Source: pom)

Я могу активировать jdk1.6 из командной строки. Я просто хочу активировать его по умолчанию в своих дочерних помпонах.


person David W.    schedule 04.11.2016    source источник
comment
Обязательно ли использовать профиль? Если вы просто хотите переопределить используемый JDK, используйте свойство Maven, например javac.source для source и javac.target для target из maven-compiler-plugin. Затем вы можете позволить дочернему POM определить два свойства, когда им нужно другое, чем значение по умолчанию (которое родитель установит на 1.7).   -  person Tunaki    schedule 04.11.2016
comment
Я думаю, что вы усложняете себе ситуацию, добавляя профиль. Если ваша цель состоит в том, чтобы скомпилировать эти проекты с другим jdk, чем тот, который указан в super pom, то пусть ваш дочерний проект переопределит версию компилятора в его pom. Вы пытались это сделать?   -  person RITZ XAVI    schedule 04.11.2016
comment
Не могли бы вы добавить данные своего профиля, выполняя цель help:all-profiles?   -  person Manuel Spigolon    schedule 04.11.2016
comment
Да, я определил <plugin> с maven-compiler-plugin в своих дочерних помпонах. Это добавляет некоторую сложность и много дублирования между pom. Я думал, что решение этой проблемы через родительский pom сделает ее проще.   -  person David W.    schedule 04.11.2016


Ответы (1)


ААААААААААААА!

Это я кричу.

Я нашел проблему и почему это не сработало.

В моем родительском помпе у меня было следующее:

<properties>
    <javac.source>1.7</javac.source>
    <javac.source>1.7</javac.source>
    <old.javac.source>1.7</old.javac.source>
    <old.javac.source>1.7</old.javac.source>
    ...
</properties>
<profiles>
    <profile>
        <id>jdk1.6</id>
        <activation>
            <property>
               <name>use-jdk1.6</name>
            </property>
        </activation>
        <build>
        <plugins>
           ....
           <plugin>
                 <groupId>maven-compiler-plugin</groupId>
                 ...
                 <configuration>
                     <!-- This isn't doing what I think -->
                     <source>${old.javac.source}</source>
                     <target>${old.javac.target}</source>
                     ...
                 </configuration>
           </plugin>
      </plugins>
<profile>

В моем детском помпе у меня было это:

 <properties>
     <use-jdk1.6>true</use-jdk1.6>
</properties>

И оказалось, что установка свойства use-jdk1.6 просто не работает. Однако это было не так. Я настраивал профиль.

Что происходит, если у меня установлены системные свойства javac.source и javac.target, они переопределяют конфигурацию maven-compiler-pluing (даже если я явно установил <source> и <target>, чтобы не использовать версию 1.7).

Итак, я потратил шесть часов на эту проблему, прежде чем понял, что это связано с тем, что я установил свойство с именем javac.source, а не что-то вроде java-version.

person David W.    schedule 04.11.2016