Maven: сборка задач (обновление / копирование файлов и т. Д.) Вне жизненного цикла?
Каков популярный подход к управлению задачами сборки при использовании Maven? В настоящее время я использую Maven для управления зависимостями, но мне нужно определить несколько "задач", которые могут быть выполнены в любое время независимо от жизненного цикла, аналогичного тому, что предоставляет Ant или Rake; просто простая "функция", которая выполняет последовательность шагов всякий раз, когда она вызывается по имени.
Например, одна "задача" будет взять jar
файл из предоставленной пользователем папки, установите его в локальном репозитории Maven, связанном с одним из моих модулей maven, используя mvn install:install-file -DlocalRepositoryPath=repo
и измените pom.xml этого модуля, чтобы он указывал на новую версию фляги. Эта задача не имеет никакого отношения к жизненному циклу, это просто общая задача, чтобы сделать какую-то конкретную вещь, поэтому мне не нужно делать это вручную, выполняясь в любое время, когда я хочу, набрав, например, mvn task:update-jar
,
Другим примером может быть "задача", которая удаляет содержимое каталога внутри одного из моих модулей maven, а затем копирует содержимое из предоставленного пользователем каталога в пустой каталог. Опять же, эта задача не имеет ничего общего с Maven или зависимостями, но приятно не делать это все время вручную.
Как люди пишут эти задачи - это должно быть общей проблемой? Я знаю, что Maven обеспечивает antrun
плагин, но, насколько я знаю, он может связывать только фазы жизненного цикла Maven, что не то, что я хочу. Я мог бы использовать Ant кроме maven с файлом build.xml, но это глупо, если Maven каким-то образом можно настроить так, чтобы он делал то, что я хочу сам. Кроме того, требование, чтобы ОБА Maven и Ant управляли моим проектом, кажется неоптимальным.
2 ответа
Если вы настаиваете, чтобы ваша сборка работала таким образом, Maven не будет для вас правильным выбором.
Однако у вас есть другая альтернатива, если вы просто хотите, например, управление зависимостями
- Gradle
- Плющ + Муравей
Они предоставляют вам прямую поддержку управления зависимостями с помощью репозитория Maven, но дают вам полный контроль над потоком сценария сборки.
Вы можете использовать maven-antrun-plugin http://maven.apache.org/plugins/maven-antrun-plugin/
так что вы можете использовать командную строку, как это mvn antrun:run
где run - это цель, определенная вами в pom.xml
С этим плагином вы можете использовать смесь "maven-ant", а также вызывать ant-файлы в maven. Используйте это осторожно, потому что конфигурация вашего проекта может быть настоящим беспорядком.
Простой пример, используемый в моем проекте для замены свойств в разных файлах
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<!-- #1 : call antrun to merge projet with convinient conf files -->
<execution>
<id>replace</id>
<phase>generate-resources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<ant antfile="replace.xml"/>
</tasks>
</configuration>
</execution>
<!-- #2 : call antrun to explode war created in target directory-->
<execution>
<id>unwar</id>
<phase>install</phase>
<configuration>
<tasks>
<!-- add conf folder (was ignored during war creation) -->
<copy todir="./target/${project.artifactId}-${project.version}/conf">
<fileset dir="./conf"/>
</copy>
<!-- rebuild war with conf folder newly added -->
<delete>
<fileset dir="./target">
<include name="${project.artifactId}-${project.version}.war"/>
</fileset>
</delete>
<war basedir="./target/${project.artifactId}-${project.version}" destfile="./target/${project.artifactId}-${project.version}.war" webxml="./target/${project.artifactId}-${project.version}/WEB-INF/web.xml"/>
<!-- copy war and exploded webapp-->
<copy todir="./${project.artifactId}/${project.version}/${project.artifactId}-${project.version}">
<fileset dir="./target/${project.artifactId}-${project.version}"/>
</copy>
<copy file="./target/${project.artifactId}-${project.version}.war" todir="/devef/maven/repository/fr/as/galilei/${project.artifactId}/${project.version}"/>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-nodeps</artifactId>
<version>1.6.5</version>
</dependency>
</dependencies>
</plugin>