views:

2290

answers:

2

My assembly descriptor applies the includes and excludes correctly when the dependencies are included in the pom file directly.

However when I put the dependencies in the parent pom file the assembly:directory goal reports that the includes and excludes haven't been triggered.

Do you know why maven-assembly-plugin ignores parent dependencies? How can I fix it?

Here are the maven and assembly descriptors:

Assembly descriptor:

<assembly>
  <id>distribution</id>
  <formats>
    <format>zip</format>
  </formats>
  <fileSets>
    <fileSet>
      <includes>
        <include>readme.txt</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>target</directory>
      <outputDirectory>/lib</outputDirectory>
      <includes>
        <include>*.jar</include>
      </includes>
    </fileSet>
  </fileSets>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/lib</outputDirectory>
      <unpack>false</unpack>
      <scope>runtime</scope>
      <excludes>
        <exclude>org.tanukisoftware:wrapper:exe:3.3.5</exclude>
      </excludes>
    </dependencySet>
    <dependencySet>
      <outputDirectory>/bin</outputDirectory>
      <unpack>false</unpack>
      <scope>runtime</scope>
      <includes>
        <include>org.tanukisoftware:wrapper:exe:3.3.5</include>
      </includes>
    </dependencySet>
  </dependencySets>
</assembly>

Child POM assembly plugin definition:

    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <ignoreDirFormatExtensions>true</ignoreDirFormatExtensions>
            <descriptors>
                <descriptor>assembly.xml</descriptor>
            </descriptors>
        </configuration>
        <executions>
            <execution>
                <id>make-assembly</id>
                <phase>package</phase>      
                <goals>
                    <goal>directory</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

Parent POM dependencies:

<dependencies>
    <dependency>
        <groupId>org.tanukisoftware</groupId>
        <artifactId>wrapper</artifactId>
        <version>3.3.5</version>
        <type>dll</type>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.tanukisoftware</groupId>
        <artifactId>wrapper</artifactId>
        <version>3.3.5</version>
        <type>exe</type>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.tanukisoftware</groupId>
        <artifactId>wrapper</artifactId>
        <version>3.3.5</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>

Warnings in the build report:

[assembly:directory {execution: make-assembly}]
Reading assembly descriptor: assembly.xml
Processing DependencySet (output=/lib)
[WARNING] The following patterns were never triggered in this artifact exclusion filter:
o  'org.tanukisoftware:wrapper:exe:3.3.5'

Processing DependencySet (output=/bin)
[WARNING] The following patterns were never triggered in this artifact inclusion filter:
o  'org.tanukisoftware:wrapper:exe:3.3.5'
+2  A: 

I don't know if this will help, but what I always do is in the parent's pom put the dependencies in a dependencyManagement block;

    <dependencyManagement>
    <!-- dependencies with exclusions -->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>

            <version>${version.springframework}</version>

            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

Then, in the child pom, list the dependencies again, but without the version and exclusions

  <dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
    </dependency>

But to be honest, for my first and only assembly, I couldn't get it to work in a child module and put it in the parent's pom. Here's my assembly file, for making a zip file for a standalone java program, run by cron:

<?xml version="1.0" encoding="UTF-8"?>

${project.layer}-both

<formats>
    <format>zip</format>
</formats>

<includeBaseDirectory>false</includeBaseDirectory>

<baseDirectory>/</baseDirectory>

<moduleSets>
    <moduleSet>
        <includes>
            <include>edu.berkeley.ist.cars:cars_upload</include>
        </includes>

        <binaries>
            <unpack>false</unpack>
            <useStrictFiltering>true</useStrictFiltering>
            <includeDependencies>true</includeDependencies>
            <outputDirectory>upload</outputDirectory>
        </binaries>
    </moduleSet>

    <moduleSet>
        <includes>
            <include>edu.berkeley.ist.cars:cars_download</include>
        </includes>

        <binaries>
            <unpack>false</unpack>
            <useStrictFiltering>true</useStrictFiltering>
            <includeDependencies>true</includeDependencies>
            <outputDirectory>download</outputDirectory>
        </binaries>
    </moduleSet>
</moduleSets>

<!--
    crontab.txt is put in twice, in both upload and download, just in case.
    -->
<files>
    <!-- upload files -->
    <file>
        <source>src/stuff/scripts/cars_upload.sh</source>
        <lineEnding>unix</lineEnding>
        <filtered>true</filtered>
        <outputDirectory>upload</outputDirectory>
    </file>

    <file>
        <source>src/stuff/notes/crontab-${project.layer}.txt</source>
        <destName>crontab.txt</destName>
        <lineEnding>unix</lineEnding>
        <filtered>true</filtered>
        <outputDirectory>upload</outputDirectory>
    </file>

    <!-- download files -->
    <file>
        <source>src/stuff/scripts/cars_download.sh</source>
        <lineEnding>unix</lineEnding>
        <filtered>true</filtered>
        <outputDirectory>download</outputDirectory>
    </file>

    <file>
        <source>src/stuff/notes/crontab-${project.layer}.txt</source>
        <destName>crontab.txt</destName>
        <lineEnding>unix</lineEnding>
        <filtered>true</filtered>
        <outputDirectory>download</outputDirectory>
    </file>
</files>

There are two top level directories in the zip file, upload and download.

lumpynose
A: 

It actually helped me. I was wrongly assuming that I dont need to declare the dependencies in the child pom if they exist in the parent one.

Thanks

Kostas