Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

maven assembly ignores parent dependencies

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'
like image 478
Kostas Avatar asked Jun 23 '09 18:06

Kostas


1 Answers

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

<assembly>
  <id>${project.layer}-both</id>

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

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

like image 83
lumpynose Avatar answered Sep 28 '22 03:09

lumpynose