Плагин maven-assembly - как создавать вложенные сборки - PullRequest
29 голосов
/ 06 октября 2009

У меня есть проект, в котором я пытаюсь создать zip-файл дистрибутива, который содержит (помимо других файлов) исполняемый файл jar с зависимостями моего проекта 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-файл.

Так что часть моего помпа выглядит так:

<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-с-зависимости строится. Мой дистрибутив zip файл строится. Но файл dist zip не содержит файл jar-with-dependencies.

Ответы [ 2 ]

47 голосов
/ 06 октября 2009

С вашей существующей конфигурацией две отдельные конфигурации для подключаемого модуля сборки будут объединены, и конфигурации также будут объединены.

Для достижения вашей цели вы должны определить одну конфигурацию плагина сборки с несколькими вложенными выполнениями, а затем определить конфигурацию для каждого выполнения внутри него. Плагин сборки будет выполнять каждую сборку последовательно, поэтому банку 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>
0 голосов
/ 06 октября 2009

У вас есть две разные конфигурации для подключаемого модуля сборки, и вы хотите, чтобы они работали по порядку (jar перед zip), но я не думаю, что Maven подразумевает какой-либо порядок того, как это будет решено. Я предполагаю, что zip-файл генерируется до JAR-файла.

Даже если это не так, я бы предложил вам создать один модуль для каждого артефакта. Переместите сборку JAR в собственный модуль, и теперь модуль Zip-only зависит от него. Таким образом, разрешение порядка зависимостей Maven может сработать и построить их по порядку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...