Выполнить задачу муравья в фазе постройки 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 пост на некоторые советы, если вы заинтересованы в этом альтернативном подходе.

Другие вопросы по тегам