Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
1.2.1
-
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).