The maven-remote-resources-plugin (1.2.1) fails to create a usable Resource 
Bundle if the outputDirectory configuration parameter is specified and does not 
explicitly contain ${project.build.outputDirectory}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                 Key: MRRESOURCES-56
                 URL: https://jira.codehaus.org/browse/MRRESOURCES-56
             Project: Maven 2.x Remote Resources Plugin
          Issue Type: Bug
    Affects Versions: 1.2.1
         Environment: Window XP, Java 1.6
            Reporter: Gareth Tudor Eley
         Attachments: test.zip

Issue:

The maven-remote-resources-plugin (1.2.1) fails to create a usable Resource 
Bundle if the outputDirectory configuration parameter is specified and does not 
explicitly contain ${project.build.outputDirectory} - this makes 
${project.build.outputDirectory} the only viable configuration.

The documentation for the remote-resources:bundle goal: (see: 
http://maven.apache.org/plugins/maven-remote-resources-plugin/bundle-mojo.html#outputDirectory)
 states:

  outputDirectory:

  The directory where you want the resource bundle manifest written to.
  •Type: java.io.File
  •Required: No
  •Expression: ${project.build.outputDirectory}

Reproduction the issue:

With this initial POM:

<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>org.gteley</groupId>
  <artifactId>test</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-remote-resources-plugin</artifactId>
        <version>1.2.1</version>
        <executions>
          <execution>
            <goals>
              <goal>bundle</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <includes>
            <include>**/database*</include>
          </includes>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

With this project directory structure:

test/
  |
  +src/
    |
    + main/
      |
      + resources
        |
        `database.ddl
        `database.sql


Execute this command: mvn clean package to obtain this good result:

test/
  |
  +src/
  |
  +target/
    |
    +test-0.0.1-SNAPSHOT.jar/
      |
      `database.ddl
      `database.sql
      |
      + META-INF\
        |
        ` MANIFEST.MF
        |
        + maven
          |
          ` remote-resources.xml
          |
          + org.gteley/
            |
            `pom.properties
            `pom.xml
    |
    + classes/
      |
      `database.ddl
      `database.sql
      |
      + META-INF\
        |
        + maven
          |
          ` remote-resources.xml
    |
    + maven-archiver/
      |
      ` pom.properties
    |
    + maven-shared-archive-resources/
    + test-classes/

Everything is fine, the contents of the Resource Bundle 
(test-0.0.1-SNAPSHOT.jar) are as required and expected for subsequent 
consumption by the remote-resource:process goal..

Now, amend the POM to explicitly specify the default value for the 
outputDirectory parameter:

        (...)
        <configuration>
          <includes>
            <include>**/database*</include>
          </includes>
          <outputDirectory>
            ${project.build.outputDirectory}
          </outputDirectory>
        </configuration>
        (...)

Execute this command again: mvn clean package to obtain the same good result.

OK far, now amend the POM to explicitly specify an alternative value 
(${project.build.directory}) for the outputDirectory parameter:

        (...)
        <configuration>
          <includes>
            <include>**/database*</include>
          </includes>
          <outputDirectory>
            ${project.build.directory}
          </outputDirectory>
        </configuration>
        (...)


The result below now reveals the issue, the Resource Bundle 
(test-0.0.1-SNAPSHOT.jar) is created, but without the necessary 
META-INF/maven/remote-resources.xml file:

test/
  | 
  |
  + META-INF\
    | 
    ` MANIFEST.MF
    | 
    + maven
      |
      ` remote-resources.xml
      |
      + org.gteley/
        |
        `pom.properties
        `pom.xml
  | 
  +src/
  | 
  +target/
    |
    +test-0.0.1-SNAPSHOT.jar/
      |
      `database.ddl
      `database.sql
    |
    + classes/
      |
      `database.ddl
      `database.sql
    |
    + maven-archiver/
      |
      ` pom.properties
    |
    + maven-shared-archive-resources/
    + test-classes/
         
By specifying ${project.build.directory} the 
META-INF/maven/remote-resources.xml file lies at the same directory level as 
the src and target directories (as expected) - but the  Resource Bundle 
(test-0.0.1-SNAPSHOT.jar) does not now contain the 
META-INF/maven/remote-resources.xml file rendering useless for subsequent 
processing by the remote-resource:process goal:

Another way to also render the Bundled Resource useless for processing by the 
remote-resource:process goal is to append a subdirectory to the valid 
${project.build.outputDirectory} configuration.

Amend the POM again this time specify an additional subdirectory to the 
${project.build.outputDirectory} configuration of the outputDirectory parameter 
like this:

        (...)
        <configuration>
          <includes>
            <include>**/database*</include>
          </includes>
          <outputDirectory>
            ${project.build.outputDirectory}/somedirectory
          </outputDirectory>
        </configuration>
        (...)

Execute this command: mvn clean package to obtain this bad result:

test/
  | 
  +src/
  | 
  +target/
    |
    +test-0.0.1-SNAPSHOT.jar/
      |
      `database.ddl
      `database.sql
      |
      + somedirectory
        |
        + META-INF\
          | 
          ` MANIFEST.MF
          |
          + maven
            |
            ` remote-resources.xml
            |
            + org.gteley/
              |
              `pom.properties
              `pom.xml
    |
    + classes/
      |
      `database.ddl
      `database.sql
      |
      + somedirectory
        |
        + META-INF\
          | 
          + maven
            |
            ` remote-resources.xml
    |
    + maven-archiver/
      |
      ` pom.properties
    |
    + maven-shared-archive-resources/
    + test-classes/

The META-INF/maven/remote-resources.xml  file now stems from the somedirectory/ 
directory, and not from the Jar's root directory as so again the Resource 
Bundle cannot be consumed by the remote-resource:process goal

One other avenue I've found that prevents the 
META-INF/maven/remote-resources.xml file from appearing in the Resource Bundle 
(test-0.0.1-SNAPSHOT.jar) is to update the execution section of the POM to 
include a phase like this:

    (...)
        <executions>
          <execution>
          <phase>package</phase>
            <goals>
              <goal>bundle</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <includes>
            <include>**/database*</include>
          </includes>
        </configuration>
       (...)

Execute this command: mvn clean package to obtain this bad result:

test/
  | 
  +src/
  | 
  +target/
    |
    +test-0.0.1-SNAPSHOT.jar/
      |
      `database.ddl
      `database.sql
      |
      + META-INF\
        | 
        ` MANIFEST.MF
        | 
        + maven
          |
          + org.gteley/
            |
            `pom.properties
            `pom.xml
    |
    + classes/
      |
      `database.ddl
      `database.sql
      |
      + META-INF\
        | 
        + maven
          |
          ` remote-resources.xml
    |
    + maven-archiver/
      |
      ` pom.properties
    |
    + maven-shared-archive-resources/
    + test-classes/


This time, the remote-resources.xml correctly appears in the classes directory 
under classes/META-INF/maven/remote-resources.xml - but it does not get 
included in the Resource Bundle (test-0.0.1-SNAPSHOT.jar).


--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to