Uploaded image for project: 'Maven Remote Resources Plugin'
  1. Maven Remote Resources Plugin
  2. MRRESOURCES-56

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}

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 1.2.1
    • 1.4
    • None
    • Window XP, Java 1.6

    Description

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

      Attachments

        1. test.zip
          2 kB
          Gareth Tudor Eley

        Activity

          People

            dennisl@apache.org Dennis Lundberg
            gteley Gareth Tudor Eley
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: