Search code examples
mavenmaven-assembly-plugin

maven-assembly-plugin loops over each module without being told to do so


I am just trying to copy some files into some directories, and using this plugin since I am told that it is convenient. However, whenever I try to do mvn install, the plugin somehow tries to loop over every module in my pom.xml (I never asked it to do this kind of thing) and tries to do some operation, then gives the error of :

Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:2.6:single (make-install-assembly) on project untoldProject Failed to create assembly: Error creating assembly archive install: You must set at least one file.

I want this plugin to operate on only certain modules (and folders which are not modules) which I already specify in the path, in the assembly file of mine. So I don't know why is the plugin tries to do this operation for every module.

Here is my pom.xml where I use the plugin:

<!-- This plugin is used to copy the necessary files to project.release/install folder -->
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.6</version>
          <executions>
            <execution>
              <id>make-install-assembly</id>
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
              <inherited>true</inherited>
              <configuration>
                <descriptors>
                  <descriptor>assembly.xml</descriptor>
                </descriptors>
                <appendAssemblyId>false</appendAssemblyId>
                <attach>true</attach>
              </configuration>
            </execution>
          </executions>
        </plugin>

Here is my asssembly.xml where I specify what I want to copy:

<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">
    <id>install</id>
    <formats>
        <format>dir</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>project.release/template</directory>
            <outputDirectory>project.release/install</outputDirectory>
            <lineEnding>unix</lineEnding>
            <filtered>true</filtered>
            <includes>
                <include>run.all.sh</include>
                <include>kill.all.sh</include>
                <include>packlogs.sh</include>
            </includes>
            <excludes>
                <exclude>config.properties</exclude>
                <exclude>run.all.ant</exclude>
                <exclude>run.ant</exclude>
                <exclude>packlogs.sh</exclude>
                <exclude>install.sh</exclude>
            </excludes>
        </fileSet>
    </fileSets>
</assembly>  

Given this, why does the plugin try to do this operation for every module? I just want it to happen for one module, called project.release, and that's it. I put both of my pom.xml and assembly.xml to the parent directory, for your information.

Update: For those who would like to see my project hiearchy, here is my master pom.xml:

<?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>runtime_project</groupId>
   <artifactId>runtime_project.master</artifactId>
   <version>1.0.0-SNAPSHOT</version>
   <packaging>pom</packaging>
   <properties>
      <jdk.version>1.8</jdk.version>
   </properties>
   <modules>
      <module>project.messages</module>
      <module>project.base</module>
      <module>project.logging</module>
      <module>project.mission.launch</module>
      <module>project.mission.detach</module>
      <module>project.settingsStore</module>
   </modules>
   <build>
      <sourceDirectory>src/</sourceDirectory>
      <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.2</version>
            <configuration>
               <source>${jdk.version}</source>
               <target>${jdk.version}</target>
            </configuration>
        </plugin>  

        <!-- This plugin is used to delete the contents of the project.release/install folder-->
        <plugin>
            <artifactId>maven-clean-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <id>auto-clean</id>
                    <phase>initialize</phase>
                    <goals>
                      <goal>clean</goal>
                    </goals>
                </execution>
           </executions>
            <configuration>
                <verbose>true</verbose>
                <excludeDefaultDirectories>true</excludeDefaultDirectories>
                <filesets>
                  <fileset>
                    <directory>project.release/install</directory>
                    <followSymlinks>false</followSymlinks>
                    <useDefaultExcludes>true</useDefaultExcludes>
                    <includes>
                      <include>**/*</include>
                    </includes>
                  </fileset>
                </filesets>
            </configuration>
        </plugin>   
        <!-- This plugin is used to copy the necessary files to project.release/install folder -->
        <plugin>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>2.6</version>
          <executions>
            <execution>
              <id>make-install-assembly</id>
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
              <inherited>true</inherited>
              <configuration>
                <descriptors>
                  <descriptor>deploy.xml</descriptor>
                </descriptors>
                <appendAssemblyId>false</appendAssemblyId>
                <attach>true</attach>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
   </build>
</project>

Solution

  • Given this, why does the plugin try to do this operation for every module?

    Because this is the nature of multi module project.

    I just want it to happen for one module, called project.release, and that's it. I put both of my pom.xml and assembly.xml to the parent directory, for your information.

    I give some hints, not a complete solution.

    1. create an additional module called project.release. Add it to the <modules> element in the root POM. The order doesn`t matter
    2. move the plugin-entry for the maven-assembly-plugin from the root POM to the POM of project.release
    3. In the POM of project.release, add dependencies to other modules as necessary.
    4. In the folder of project.release, place the assembly descriptor in src/main/assembly . The directory entries within your descriptor should be relative to the module root of project.release