Подтвердить что ты не робот

Плагин 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.

4b9b3361

Ответ 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 может взорваться и строить их в порядке.