Плагин maven-assembly - как создать вложенные сборки
У меня есть проект, в котором я пытаюсь создать файл zip файла дистрибутива, который содержит (среди других файлов) исполняемую банку с зависимостями моего java-проекта.
Итак, я хочу, чтобы это выглядело так:
-wiki-search-1.0.0-dist.zip
-wiki-search.bat
-wiki-search-help.html
-wiki-search-1.0.0-jar-with-dependencies.jar
-jar content...
Я использую плагин сборки и предопределенный дескриптор "jar-with-dependencies" для создания исполняемого файла jar.
Я указываю отдельную запись плагина сборки в моем pom, ссылаясь на пользовательский дескриптор, чтобы попытаться создать дистрибутивный zip файл.
Итак, часть моего pom выглядит так:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>quicksearch.QuickSearchApp</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>attached</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/main/assembly/dist.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>attached</goal>
</goals>
</execution>
</executions>
</plugin>
И мой пользовательский дескриптор выглядит следующим образом:
<assembly>
<id>dist</id>
<formats>
<format>tar.gz</format>
<format>tar.bz2</format>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<includes>
<include>${project.basedir}/target/wiki-search-0.0.1-SNAPSHOT-jar-with-dependencies.jar</include>
</includes>
<outputDirectory>.</outputDirectory>
</fileSet>
<fileSet>
<directory>${project.basedir}/src/main/etc</directory>
<includes>
<include>*</include>
</includes>
<outputDirectory></outputDirectory>
</fileSet>
</fileSets>
</assembly>
Все работает отлично. Строится jar-with-dependencies. Мой файл zip файла создается. Но файл zip dist не содержит файл jar-with-dependencies.
Ответы
Ответ 1
С вашей существующей конфигурацией ваши две отдельные конфигурации для плагина сборки будут объединены, а конфигурации также будут объединены.
Чтобы достичь своей цели, вы должны определить одну конфигурацию сборки-плагина с несколькими вложенными исполнениями, а затем определить конфигурацию для каждого выполнения внутри нее. Затем плагин сборки будет выполнять каждую сборку последовательно, поэтому банку jar-with-dependencies
будет доступна для включения в банку dist
. Также обратите внимание, что цель attached
устарела в пользу цели single
.
Также обратите внимание, что пути в сборке относятся к корню, и для включения конкретного файла вы должны использовать элемент <files>
, а не элемент <filesets>
. Вы также можете указать свойства в сборке, чтобы сделать ее менее хрупкой для изменения.
Перестроенная конфигурация и сборка ниже должны делать то, что вам нужно:
Дескриптор сборки:
<assembly>
<id>dist</id>
<formats>
<format>tar.gz</format>
<format>tar.bz2</format>
<format>zip</format>
</formats>
<files>
<file>
<source>
target/${project.artifactId}-${project.version}-jar-with-dependencies.jar
</source>
<outputDirectory>/</outputDirectory>
</file>
</files>
<fileSets>
<fileSet>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>*</include>
</includes>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
Плагин сборки:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>quicksearch.QuickSearchApp</mainClass>
</manifest>
</archive>
</configuration>
</execution>
<execution>
<id>dist</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/main/assembly/dist.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
Ответ 2
У вас есть две разные конфигурации для подключаемого модуля, и вы хотите, чтобы их запускали в порядке (jar до zip), но я не думаю, что Maven подразумевает любой порядок в том, как это будет разрешено. Я предполагаю, что zip файл генерируется перед JAR файлом.
Даже если это не так, я предлагаю вам создать один модуль для артефакта. Переместите узел JAR в его собственный модуль и зависеть от этого модуля Zip-only. Таким образом, разрешение порядка зависимостей Maven может взорваться и строить их в порядке.