Использование maven с внешними скриптами сборки
Мое приложение зависит от стороннего уха (оно деконструирует его, добавляет / модифицирует некоторые элементы в нем и реконструирует его в новое ухо). Стороннее ухо должно быть построено с использованием стороннего сценария сборки.
Я пытаюсь научиться "maven-y" способ настроить это. Я ожидаю, что мне нужно будет установить стороннее ухо в мой репозиторий.
Я хочу создать pom.xml для стороннего уха, который соберет стороннее ухо и установит / развернет его. Я создал pom.xml, который успешно вызывает сторонний скрипт сборки (через maven-antrun-plugin) и создает ear именно в том месте, где будет проект по умолчанию maven ear.
Моя проблема в том, что плагин установки maven завершается неудачно, потому что он не может найти архив (он ожидает, что плагин, который делает упаковка, установит атрибут для объекта артефакта, чего не делает maven-antrun-plugin).
mvn package
прекрасно работает и генерирует ухо.
Точное сообщение об ошибке при запуске mvn install
выглядит так:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.3.1:install (default-install) on project third_party_ear: The
packaging for this project did not assign a file to the build artifact -> [Help 1]
Есть ли лучший способ сделать это?
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.thirdparty</groupId>
<artifactId>third_party_ear</artifactId>
<version>9.0</version>
<packaging>ear</packaging>
<name>third_party_ear</name>
<build>
<plugins>
<plugin>
<artifactId>maven-ear-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>default-ear</id>
<phase>none</phase>
</execution>
<execution>
<id>default-generate-application-xml</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>package</phase>
<configuration>
<target>
<subant target="build-ear" antfile="build.xml" buildpath="${project.basedir}"/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
1 ответ
Когда вы указываете <packaging>ear</packaging>
вы говорите Maven запустить полный жизненный цикл, указанный для этой упаковки.
В вашем случае, что вы хотите сделать, это написать обертку pom.xml
это просто добавляется в ваш сторонний скрипт сборки, не вызывая жизненный цикл EAR и присоединяя полученный артефакт к реактору Maven...
Как то так должно работать
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.thirdparty</groupId>
<artifactId>third_party_ear</artifactId>
<version>9.0</version>
<packaging>pom</packaging>
<name>third_party_ear</name>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.7</version>
<executions>
<execution>
<phase>package</phase>
<configuration>
<target>
<subant target="build-ear" antfile="build.xml" buildpath="${project.basedir}"/>
<attachartifact file="${project.build.directory}/${project.build.finalName}.ear" type="ear"/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Могут быть небольшие сбои, потому что упаковка pom отличается... но так как это не относящийся к classpath артефакт, они не должны влиять на вас.
Обратите внимание attachartifact
Задача ANT может прикрепить артефакт из любого места, поэтому вам не нужно сражаться с ANT, чтобы получить файл в "правильном" месте... хотя лучше следовать этому соглашению. Вы можете не использовать project.build.finalName
и жестко закодировать имя файла.