2010-02-11 3 views
14

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

  • сервер переднего плана
  • фонового сервер
  • DB

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

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

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

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

<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> 

И бэкэнд и профили БД находятся в конфигурации подмодуля 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, btw). Если установить свойство из командной строки с

mvn -Ddb=dev02 help:active-profiles 

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

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

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

ответ

16

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

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

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

+0

@Brett, спасибо, это прояснилось. Но последнее: вы написали: «Решение, которое вы использовали, имеет одинаковые свойства для активации того, что вы хотите делать вместе, - лучшее решение». В каком смысле? Эстетически, может быть, но он все равно не работает ... –

+1

Я имел в виду один «из командной строки». Поэтому, если вам нужно, чтобы 'profile1' подразумевал, что' profile2' активирован, убедитесь, что оба они активированы с помощью 'propertyX', а затем используйте' mvn -DpropertyX' вместо 'mvn -Pprofile1'. Это не так гибко, как то, что вы искали. –

3

Issue MNG-2276 упоминается Бретт был решен в Maven 3.x, так что вы теперь можете определить свойства в настройках. 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> 

Хорошая идея использовать плагин, занимающееся принудительным заставить 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> 
Смежные вопросы