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 не будет для вас правильным выбором.

Однако у вас есть другая альтернатива, если вы просто хотите, например, управление зависимостями

  1. Gradle
  2. Плющ + Муравей

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