Maven: если предложения в pom.xml в теге свойства

Я хотел бы установить свойство, если установлена ​​переменная среды. Я много гуглил, и все, что я нашел, похоже на код ниже, но я продолжаю получать сообщение об ошибке:

[FATAL] Неанализируемый POM Y:\Maven\parent-pom\pom.xml: за TEXT должен следовать END_TAG, а не START_TAG (позиция: START_TAG s een ...properties"\r\ n
classpathref="maven.plugin.classpath" />... @29:55) @ строка 29, столбец 55

Это код, который я пробую, он внутри pom.xml, и я выполнил команду -

mvn --errors развертывание

Конечно, я буду рад получить любое другое решение, если у вас есть другое предложение о том, как установить свойство в pom.xml в зависимости от содержимого переменной среды.

Спасибо, Эли

    <distributionManagement>
       .....
    </distributionManagement>

    <properties>
          <tasks>
        <taskdef resource="net/sf/antcontrib/antcontrib.properties"
          classpathref="maven.plugin.classpath" />

        <if>
           <condition>
             <equals arg1="${env.WAS60_HOME}" arg2=""\>
           </condition>
           <then>
             <was60.home>${env.WAS60_HOME}</was60.home>
             <javac>${was60.home}/java/bin/javac</javac>
           </then>
        </if>

         <if>
           <condition>
             <equals arg1="${env.WAS85_HOME}" arg2=""\>
           </condition>
           <then>
             <was85.home>${env.WAS85_HOME}</was60.home>
             <javac>${was85.home}/java/bin/javac</javac>
           </then>
        </if>
      </tasks>
</properties>
    <profiles>
       <profile>
    <id>was.base.v60</id>
            <dependencies>
               <dependency>
                 ....
                  <systemPath>${was60.home}/java/jre/lib/xml.jar</systemPath>
               </dependency>
               .....
            </dependencies>
        </profile>
        <profile>
    <id>was.base.v85</id>
            <dependencies>
               <dependency>
                 ....
                  <systemPath>${was85.home}/java/jre/lib/xml.jar</systemPath>
               </dependency>
               .....
            </dependencies>
        </profile>
    </profiles>

person Elyahu    schedule 05.08.2013    source источник


Ответы (4)


Гораздо лучшим подходом было бы использование активации профиля.

<profiles>
  <profile>
    <id>was.base.v60</id>
    <activation>
      <property>
        <name>env.WAS60_HOME</name>
      </property>
    </activation>
    <dependencies>
      <dependency>
        ....     
        <systemPath>${env.WAS60_HOME}/java/jre/lib/xml.jar</systemPath>
      </dependency>
      .....    
    </dependencies>
  </profile>
  <profile>
    <id>was.base.v85</id>
    <activation>
      <property>
        <name>env.WAS85_HOME</name>
      </property>
    </activation>
    <dependencies>
      <dependency>
        ....     
        <systemPath>${env.WAS85_HOME}/java/jre/lib/xml.jar</systemPath>
      </dependency>
      .....    
    </dependencies>
  </profile>
</profiles>

Обновлять:

Мой предпочтительный способ использования профилей — иметь набор свойств по умолчанию в моем POM, а затем переопределять их по требованию, используя профили в моем файле настроек.

Этот подход легко реализовать явно, используя параметры командной строки «-s» и «-P»:

mvn -s $PROJECT_SETTINGS -P myProfile ....

Этот подход легко поддерживать в Jenkins с помощью плагина Config File Provider, который включает графический интерфейс для редактирования различных файлов настроек, которые я использую для каждого проекта.

Обновление 2:

Вот пример того, как я настраиваю свои сборки. POM содержит раздел со значениями свойств по умолчанию. И я настраиваю один или несколько файлов pfile, чтобы переопределить эти значения:

<project>
  <properties>
     <my.property1>hello</my.property1>
     <my.property2>world</my.property2>
     ..
  </properties>
  ..

  <build>
    <profiles>
      <profile>
        <id>build_in_spanish</id>
        <properties>
          <my.property1>hola</my.property1>
          <my.property2>mundo</my.property2>
          ..
        </properties>
      </profile>
      <profile>
        <id>build_in_irish</id>
        <properties>
          <my.property1>dia dhuit</my.property1>
          <my.property2>an domhain</my.property2>
          ..
        </properties>
      </profile>
    <profiles>
  </build>
</project>

Так что в этом примере сборка по умолчанию на английском языке. Для запуска сборки с настройками на испанском языке

mvn -P build_in_spanish ...

Примечание:

  • Профили могут находиться в POM или в отдельном файле настроек. Последний подход обеспечивает наибольшую гибкость.
  • Профили могут быть включены явно (используя параметр командной строки «-P» или пытаясь обнаружить среду, в которой он находится. Это выбор дизайна)
person Mark O'Connor    schedule 05.08.2013
comment
Зачем мне нужна активация, если вы используете ${env.WAS##_HOME} напрямую. - person Elyahu; 05.08.2013
comment
Другой вопрос, что делать, если переменная ENV не установлена ​​или пуста - person Elyahu; 05.08.2013
comment
Спасибо, Марк, но я все еще не понимаю, как вы относитесь к случаю, когда переменная может быть не установлена ​​или не установлена ​​​​ничего? - person Elyahu; 05.08.2013
comment
@Elyahu Полностью зависит от вас. Я обновил свой ответ подробностями о том, как я использую профили. - person Mark O'Connor; 05.08.2013
comment
Привет, Марк, так как ты лечишь случаи, когда переменная не установлена ​​или пуста? - person Elyahu; 06.08.2013
comment
@Elyahu Обновлено с примером. Я избегаю свойств с пустыми значениями, указав значения по умолчанию в разделе свойств POM. - person Mark O'Connor; 06.08.2013
comment
Еще раз спасибо, Марк, ваше предложение кажется приемлемым, и я могу его использовать. Но я должен быть обратно совместим, поэтому, если свойство определено как переменная среды, перезапишет ли оно определение в pom.xml? Этот pom.xml является родительским файлом pom для всех наших разработчиков, поэтому его изменение может иметь большое значение. - person Elyahu; 11.08.2013
comment
@Elyahu Вместо того, чтобы явно указывать профиль (как я), почему бы не активировать свой профиль с помощью переменных среды? (См. документацию по активации профиля). Таким образом, вы сохраняете обратную совместимость, но получаете преимущество использования профилей для управления средой сборки. - person Mark O'Connor; 11.08.2013

По-видимому, в Maven нет возможности сделать правильное предложение IF-THEN-ELSE. По крайней мере, ни один из тех, что я нашел.

Самое близкое, что я нашел, это использование тега «активация». который активирует профиль, если условие в нем выполнено.

В Maven 2.0.X есть некоторая ошибка при нескольких условиях, не уверен, каков ее статус сейчас -

http://jira.codehaus.org/browse/MNG-4565

Итак, пример кода отвечает на вопрос здесь -

Maven 2: запустить maven-replacer-plugin с условной заменой значение?

Но если вы хотите сделать что-то вроде ‹‹ ЕСЛИ... Тогда... Иначе >> Вы ударитесь головой о стену, делая это. Конечно, есть и другие способы, и я предполагаю, что это делается специально, поэтому вам придется следовать пути Мейвена.

Спасибо всем, кто пытался помочь Эльяху

person Elyahu    schedule 19.08.2013
comment
Это большая проблема с Maven: вы должны делать что-то в стиле Maven, что всегда настолько неинтуитивно, что после двух часов попыток найти и применить соответствующую документацию я сдаюсь. - person reinierpost; 27.01.2015

попробуйте заменить \> на /> в строках

<equals arg1="${env.WAS60_HOME}" arg2=""\>
person Julia Sokolova    schedule 13.02.2015