Выполнить задачу муравья в фазе постройки maven перед упаковкой войны?
При развертывании веб-приложения мне нужно объединить некоторые файлы, в настоящее время это достигается с помощью задачи ant. Я пытаюсь запустить эту задачу в процессе сборки 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 уже был создан до запуска цели ant.
По сути, мне нужно запустить цель для муравьев ближе к концу фазы подготовки пакета.
Посмотрев " Справочник по жизненному циклу", я не могу понять, как раскрыть более детальные цели для плагина antrun.
Вопрос: Как добиться этого сценария?
1 ответ
Вместо того, чтобы выполнить его в конце prepare-package
фаза, вы, вероятно, хотите выполнить его в package
фаза, но до war
упаковка (через Maven War Plugin).
Возможное решение:
- Отключить плагин Maven War по умолчанию
- Добавьте ваше исполнение в пределах
package
фаза - Добавьте новое исполнение Maven War Plugin для
package
фаза
Поскольку Maven будет выполнять плагины в пределах одной и той же фазы в соответствии с порядком объявления, сначала вам нужно будет выполнить ant, а затем war
упаковка.
Выполнение следующего:
mvn help:effective-pom
Вы можете проверить, что по умолчанию пакет war уже настраивает исполнение Maven War Plugin для нас:
<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 и фильтрации ресурсов Maven, делегируя свойствам различия между средами и, таким образом, избегая обмена файлами.
Проверьте этот SO пост на некоторые советы, если вы заинтересованы в этом альтернативном подходе.