2016-03-23 4 views
1

При развертывании webapp мне нужно конкатрировать некоторые файлы, в настоящее время это достигается с помощью задачи ant. Я пытаюсь выполнить эту задачу в процессе сборки Maven, используя что-то вроде следующего:Запустить муравьиную задачу в фазе сборки maven до войны?

<plugin> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <version>1.7</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <configuration> 
       <target> 
        <move file="${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/log4j.dev.properties" 
         tofile="${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/log4j.properties" /> 

        <move file="${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/hibernate.cfg.dev.xml" 
         tofile="${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/hibernate.cfg.xml" /> 
        <delete> 
         <fileset dir="${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/" 
          includes="**/hibernate.cfg.*.xml" /> 
         <fileset dir="${project.build.directory}/${project.name}-${project.version}/WEB-INF/classes/" 
          includes="**/log4j.*.properties" />  
        </delete> 
       </target> 
      </configuration> 
      <goals> 
       <goal>run</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

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

В принципе, мне нужно запустить мою цель муравья ближе к концу фазы подготовки-упаковки.

Посмотрев, как Lifecycle Reference Я не могу тренироваться, как разоблачить более гранулированные цели в плагин antrun.

Вопрос: Как достичь этого сценария?

+0

в конце пакета подготовки означает, что вы установите пакет подготовки в фазовом элементе. По той же причине, если вы поместите туда пакет, он будет выполнен после того, что поступит по умолчанию. Итак, вы хотите выполнить его перед исполнением maven-war-plugin, правильно? –

+0

@ A.DiMatteo да это правильно – Mercer

ответ

3

Вместо того, выполняя его в конце prepare-package фазы, вы, вероятно, хотите, чтобы выполнить его в package фазе, но перед темwar упаковки (через Maven плагин войны).

Возможное решение как можно:

  • Отключение по умолчанию Maven войны плагин
  • Добавить исполнение в package фазе
  • Добавить новое исполнение Maven войны плагин для package фазы

Поскольку Maven выполнит плагины в пределах одной фазы по порядку декларации, вы должны сначала выполнить свое муравьевое действие, затем war упаковка.

Выполнение следующих действий:

mvn help:effective-pom 

Вы можете проверить, что по умолчанию войны упаковка уже настраивает выполнение Maven войны плагина для нас:

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.2</version> 
    <executions> 
     <execution> 
      <id>default-war</id> 
      <phase>package</phase> 
      <goals> 
       <goal>war</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Мы могли бы добавить к нашему POM следующего после maven-antrun-plugin декларации:

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.2</version> 
    <executions> 
     <execution> 
      <id>default-war</id> 
      <phase>none</phase> 
      <goals> 
       <goal>war</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>package-war</id> 
      <phase>package</phase> 
      <goals> 
       <goal>war</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

Примечание: мы фактически используют один и тот же идентификатор выполнения по умолчанию и привязывают его к несуществующей фазе (none) и как таковой отключив его; то мы добавляем новое исполнение (package-war id), которое будет выполнено Maven после выполнения вашего maven-antrun-plugin, но все еще находится в фазе пакета.

Обратите внимание, что заказ на объявление действительно важен для достижения вашей цели, поэтому лучше добавить комментарий (для коллег, если они есть, и для будущего самостоятельно).


Далее обратите внимание: это, кажется, вы обмениваетесь Dev файлы с Prod-как файлы, вы могли бы, вероятно, добиться того же с помощью Maven profiles и Maven resource filtering делегируя свойств значения различия между средами и как таких во избежание замены файлов.

Проверьте this SO post за некоторые намеки, если вы заинтересованы в этом альтернативном подходе.

+0

thx это работа. Да, я обмениваю файл, с фильтром вы не можете удалять файлы, которые не используются? – Mercer

+0

Действительно, вы не можете удалить, но у вас будет только один файл, его содержимое будет иметь значения, которые могут меняться между envs (через свойства, значения через профили), так что вам не нужно будет удалять файлы в любом случае. Но у меня нет всей картины, поэтому не уверен, что она может быть применима 100% –