Почему я не могу активировать профиль Maven2 из другого профиля?

У меня есть многомодульный проект Maven2, который создает веб-приложение. Приложение подключено к бэкэнд-серверу и БД. В нашей среде развернуто несколько экземпляров серверов, а также есть несколько экземпляров серверной части и БД для разработки, UAT, производства и т. Д. Таким образом, практически для каждой конфигурации приложения требуются эти 3 координаты:

  • интерфейсный сервер
  • внутренний сервер
  • DB

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

mvn -Pserver.Server1,backend.prod,db.uat clean install

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

Но я подумал, что могу быть более умным, активировав необходимые серверные части и профиль БД прямо из профиля сервера. Профили серверов находятся в главном помпе, например

<profile>
    <id>server.myserver</id>
    <properties>
        <jboss.home>D:\Programs\jboss-4.2.1.GA</jboss.home>
        <server.name>NightlyBuild</server.name>
        <hosttobind>192.168.1.100</hosttobind>
        <servlet.port>8080</servlet.port>
        ...
        <db>dev02</db>
    </properties>
</profile>

И профили backend и DB находятся в pom подмодуля Config, например

<profile>
    <id>db.dev02</id>
    <activation>
        <property>
            <name>db</name>
            <value>dev02</value>
        </property>
    </activation>
    <properties>
        <jdbc.address>jdbc:oracle:thin:@192.168.0.101:1521:dbdev02</jdbc.address>
    </properties>
</profile>

Теоретически, поскольку профиль server.myserver устанавливает для свойства db значение dev02, это должно вызвать активацию профиля db.dev02 в дочернем pom. Однако этого не происходит. (И если два профиля находятся в одном помпе, кстати). Если я установил свойство из командной строки с помощью

mvn -Ddb=dev02 help:active-profiles

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

Я что-то упустил? Есть ли другой способ заставить эту работу работать?

Я вижу, что существует похожий вопрос: Могу ли я активировать один профиль maven другой?
Однако, ИМХО, это не дубликат - я вижу, что мой подход не работает, и хотелось бы понять, почему. (Я прочитал ссылку, но мог пропустить что-то очевидное).


person Péter Török    schedule 11.02.2010    source источник


Ответы (2)


Такой функции просто не существует. Активатор свойств использует входящие свойства, а не все, что задано профилями (иначе он не знал бы, в каком порядке их активировать, без более сложной логики).

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

Проблема, связанная с этой функцией: https://issues.apache.org/jira/browse/MNG-3309
Проблема, связанная с активацией свойства: https://issues.apache.org/jira/browse/MNG-2276

person Brett Porter    schedule 11.02.2010
comment
@Brett, спасибо, это прояснило ситуацию. И последнее, однако: вы написали. Решение, которое вы использовали, с идентичными свойствами для активации того, что вы хотите делать вместе, является лучшим решением .. В каком смысле? Эстетически может быть, но все равно не работает ... - person Péter Török; 12.02.2010
comment
Я имел ввиду тот, что из командной строки. Поэтому, если вам нужно profile1, чтобы подразумевать, что profile2 активирован, убедитесь, что они оба активированы с помощью propertyX, а затем используйте mvn -DpropertyX вместо mvn -Pprofile1. Однако это не так гибко, как то, что вы искали. - person Brett Porter; 12.02.2010

Проблема MNG-2276, упомянутая Бреттом, была решена в maven 3.x, так что теперь вы разрешено определять свойства в settings.xml для запуска профилей в вашем pom. Вот пример:

В settings.xml:

<profile>
    <id>localDist</id>
    <activation>
        <property><name>localDist</name></property>
    </activation>
    <properties>
        <doReleaseTasks>true</doReleaseTasks>
    </properties>
</profile>

В вашем помпе (или еще лучше, в родительском помпе):

<profile>
    <id>doReleaseTasks</id>
    <activation>
        <property><name>doReleaseTasks</name></property>
    </activation>
    <build>
        <plugins>
            ... mvn -DlocalDist will activate these plugins
        </plugins>
    </build>
</profile>

Хорошая идея использовать плагин enforcer для принудительной установки mvn 3.0 или выше:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-enforcer-plugin</artifactId>
            <executions>
                <execution>
                    <id>enforce-maven</id>
                    <goals> <goal>enforce</goal> </goals>
                    <configuration>
                        <rules>
                            <requireMavenVersion>
                                <version>[3.0,)</version>
                                <message>
*** Maven 3.x required to allow cascading profiles to be activated in settings.xml (MNG-2276)
                                </message>
                            </requireMavenVersion>
                        </rules>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
person russtman    schedule 10.06.2014