Использование 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 и жестко закодировать имя файла.

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