Ошибка создания архива сборки в многомодульном проекте maven

Я создал многомодульный проект maven с 2 модулями (child1, child2).
Я пытаюсь создать пакет - APP.zip, который должен содержать app.properties, child1.war и child2.war с помощью плагина сборки. .
Но я получаю следующую ошибку, когда запускаю команду mvn Assembly:single

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:2.6:single (default-cli) on project app: Failed to create assembly: Error creating assembly archive My_Package: You must set at least one file. -> [Help 1]

Структура папок проекта

app
  |
   pom.xml
   assembly.xml
   app.properties 
   child 1
       | 
       pom.xml src target
                   |
                     child1.war
   child 2
       |
       pom.xml src target
                   |
                     child2.war   

Родительский pom (app/pom.xml)

    <project>
        <groupId>com.karthik</groupId>
        <artifactId>parent</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
        <name>parent</name>

        <modules>
           <module>child 1</module>
           <module>child 2</module>
        </modules>
        <build>
           <pluginManagement>
               <plugins>
                  <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <finalName>APP</finalName>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptors>
                    <descriptor>assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                     <execution>
                    <id>make-bundles</id>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <phase>package</phase>
                      </execution>
                </executions>
            </plugin>
        </plugins>
  </pluginManagement>
</build>
</project>

сборка.xml

<assembly
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <formats>
        <format>zip</format>
    </formats>
    <id>My_Package</id>
    <includeBaseDirectory>false</includeBaseDirectory>
    <moduleSets>
        <moduleSet>
            <useAllReactorProjects>true</useAllReactorProjects>
            <includes>
                <include>com.karthik:child1</include>
                <include>com.karthik:child2</include>
            </includes>
        </moduleSet>
    </moduleSets>
</assembly>

Я полагаю, что пропустил что-то в дескрипторе сборки, что вызывает эту ошибку.
1) Не могли бы вы помочь решить эту проблему и помочь создать zip (APP.zip), содержащий app.properties, child1.war и child2. война?
2) Когда нужно использовать теги <fileSet> и <moduleSet>?


person Karthik    schedule 23.10.2017    source источник


Ответы (3)


Наконец я нашел решение

1) Добавить отдельный модуль - дистрибутив для сборки в родительский POM.

Родительский POM

<project>
        <groupId>com.karthik</groupId>
        <artifactId>parent</artifactId>
        <packaging>pom</packaging>
        <version>1.0-SNAPSHOT</version>
        <name>parent</name>

        <modules>
           <module>child 1</module>
           <module>child 2</module>
           <module>distribution</module>
        </modules>
</project>

2) Настройте плагин сборки maven в модуле распространения

Распределительный модуль ПОМ

    <parent>
        <groupId>com.karthik</groupId>
        <artifactId>parent</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>distribution</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>Distribution</name>

    <build>
        <plugins>
            <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                 <execution>
                <id>make-bundles</id>
                <goals>
                    <goal>single</goal>
                </goals>
                <phase>package</phase>
                <configuration>
                       <descriptors>
                        <descriptor>assembly.xml</descriptor>
                    </descriptors>
                </configuration>
            </execution>
        </executions>
    </plugin>
  </plugins>
</build>

3) Добавить файлы/артефакты для сборки в элемент <files> дескриптора сборки

сборка.xml

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
  <id>distribution</id>
  <formats>
      <format>zip</format>
  </formats>
  <files>
        <file>
            <source>../Child1/target/child1.war</source>
        </file>
        <file>
            <source>../Child2/target/child2.war</source>
        </file>
        <file>
            <source>../app.properties</source>
        </file>
    </files>
</assembly>
person Karthik    schedule 25.10.2017
comment
Отдельный модуль только для сборки кажется единственным решением. Существует запись часто задаваемых вопросов, которая объясняет основную ситуацию: maven .apache.org/plugins/maven-assembly-plugin/ - person Falco Preiseni; 16.09.2020

Используйте пример здесь

Это рабочий пример, родительский pom:

<?xml version="1.0" encoding="UTF-8"?>
<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.greg</groupId>
  <artifactId>assembly-example</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>assembly-example</name>

  <modules>
    <module>child1</module>
    <module>child2</module>
    <module>distribution</module>
  </modules>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>3.1.0</version>
          <configuration>
            <descriptors>
              <descriptor>src/assembly/assembly.xml</descriptor>
            </descriptors>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

</project>

Детский пом:

<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>

  <parent>
    <groupId>com.greg</groupId>
    <artifactId>assembly-example</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>child1</artifactId>
  <packaging>jar</packaging>

  <name>child1</name>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

распределение пом:

<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>

  <parent>
    <groupId>com.greg</groupId>
    <artifactId>assembly-example</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>distribution</artifactId>
  <packaging>jar</packaging>

  <name>Distribution</name>

  <dependencies>
    <dependency>
      <groupId>com.greg</groupId>
      <artifactId>child1</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>com.greg</groupId>
      <artifactId>child2</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <executions>
          <execution>
            <id>distro-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
            <configuration>
              <descriptors>
                <descriptor>src/assembly/assembly.xml</descriptor>
              </descriptors>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
</project>

Assembly.xml в каталоге дистрибутив/src/assembly:

<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">

  <id>bin</id>
  <formats>
    <format>zip</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <moduleSets>
    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects>
      <includes>
        <include>com.greg:child1</include>
      </includes>
      <binaries>
        <outputDirectory>modules/maven-assembly-plugin</outputDirectory>
        <unpack>false</unpack>
      </binaries>
    </moduleSet>
  </moduleSets>
</assembly>

mvn clean package p

Создает zip-файл:

jar tvf distribution/target/distribution-1.0-SNAPSHOT-bin.zip
     0 Mon Oct 23 14:55:10 BST 2017 modules/
     0 Mon Oct 23 14:55:10 BST 2017 modules/maven-assembly-plugin/
  2086 Mon Oct 23 14:55:06 BST 2017 modules/maven-assembly-plugin/child1-1.0-SNAPSHOT.jar
  2086 Mon Oct 23 14:55:08 BST 2017 modules/maven-assembly-plugin/child2-1.0-SNAPSHOT.jar
person Essex Boy    schedule 23.10.2017
comment
Спасибо за ответ. Но запуск команды mvn package не создает сборку. Также каким должно быть значение выходного каталога в разделе двоичных файлов? - person Karthik; 23.10.2017
comment
Также я сохранил наборы модулей в Assembly.xml. Может ли Assembly.xml в модуле дистрибутива найти другие модули - дочерние 1 и дочерние 2? - person Karthik; 23.10.2017
comment
Я получаю сообщение об ошибке после обновления POM дистрибутива — [ОШИБКА] Не удалось выполнить цель по распространению проекта: не удалось разрешить зависимости для проекта com.karthik:distribution:pom:1.0-SNAPSHOT: не удалось разрешить следующие артефакты: com. karthik:child1:jar:1.0-SNAPSHOT, com.ssga.fi:child2:jar:1.0-SNAPSHOT - person Karthik; 24.10.2017
comment
В моем случае дочерняя упаковка 1 и дочерняя 2 - это WAR, а не JAR. - person Karthik; 24.10.2017

jar tvf distribution/target/distribution-1.0-SNAPSHOT-bin.zip

     0 Mon Oct 23 14:55:10 BST 2017 modules/
     0 Mon Oct 23 14:55:10 BST 2017 modules/maven-assembly-plugin/
  2086 Mon Oct 23 14:55:06 BST 2017 modules/maven-assembly-plugin/**child1-1.0-SNAPSHOT**.jar
  2086 Mon Oct 23 14:55:08 BST 2017 modules/maven-assembly-plugin/**child2-1.0-SNAPSHOT**.jar

Здесь также вы можете получить свою войну и банку, как пожелаете. Нравится:

<outputFileNameMapping>${module.artifactId}.${module.extension}</outputFileNameMapping>

Используйте это для получения файлов war и jar.

В файле сборки:

<moduleSets>
<moduleSet>
  <useAllReactorProjects>true</useAllReactorProjects>
  <includes>
    <include>com.greg:child1</include>
  </includes>
  <binaries>
    <outputDirectory>modules/maven-assembly-plugin</outputDirectory>
    <unpack>false</unpack>
  </binaries>
</moduleSet>
Here just add the above line get that jar file, like this:
<moduleSets>
<moduleSet>
  <useAllReactorProjects>true</useAllReactorProjects>
  <includes>
    <include>com.greg:child1</include>
  </includes>
  <binaries>
    <outputDirectory>modules/maven-assembly-plugin</outputDirectory>
    <outputFileNameMapping>${module.artifactId}.${module.extension}</outputFileNameMapping>
    <unpack>false</unpack>
  </binaries>
</moduleSet>

Надеюсь, это поможет другим...

Ссылка: чтобы увидеть больше

person VARUN    schedule 13.04.2021