Sharing Resources
The Remote Resources Plugin can also be used to share resources between modules in a multi module build. In the following example we have a set of files that are used to set up a test environment for a database. We want to reuse these resources in several modules in our project.
Set up a module for the resources to be shared
Create a new module called shared-resources
. Put the files in a directory layout like the one below, making sure that your resource files are in the src/main/resources
directory:
shared-resources | +- src | | | `- main | | | `- resources | | | +- database.ddl | | | `- database.sql | `- pom.xml
The POM for shared-resources
should look like this:
<project> ... <groupId>org.test</groupId> <artifactId>shared-resources</artifactId> ... <build> <plugins> <plugin> <artifactId>maven-remote-resources-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <goals> <goal>bundle</goal> </goals> </execution> </executions> <configuration> <includes> <include>**/*.ddl</include> <include>**/*.sql</include> </includes> </configuration> </plugin> </plugins> </build> ... </project>
This will bundle the shared resources in a JAR file during the generate-resources
phase. This means that others modules can consume these resources in any phase after that.
Configure other modules to use the shared module
To use the shared resources in another module you need to configure the plugin as follows:
<project> ... <groupId>org.test</groupId> <artifactId>resource-consumer</artifactId> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-remote-resources-plugin</artifactId> <version>3.2.0</version> <configuration> <resourceBundles> <resourceBundle>org.test:shared-resources:${project.version}</resourceBundle> </resourceBundles> </configuration> <executions> <execution> <goals> <goal>process</goal> </goals> </execution> </executions> </plugin> ... <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>sql-maven-plugin</artifactId> <version>1.4</version> ... <!-- Not showing dependencies or configuration here for brevity --> ... <executions> <execution> <id>create-schema</id> <phase>process-test-resources</phase> <goals> <goal>execute</goal> </goals> <configuration> <autocommit>true</autocommit> <srcFiles> <srcFile>${project.build.directory}/maven-shared-archive-resources/database.ddl</srcFile> <srcFile>${project.build.directory}/maven-shared-archive-resources/database.sql</srcFile> </srcFiles> </configuration> </execution> ... </executions> </plugin> </plugins> </build> ... <dependencies> <dependency> <groupId>${project.groupId}</groupId> <artifactId>shared-resources</artifactId> <version>${project.version}</version> </dependency> </dependencies> </project>
This will retrieve the bundled resources of the shared-resources
module, process each resource in the bundle and put them in the ${project.build.directory}/maven-shared-archive-resources
directory of the resource-consumer
module.
That means we can use those files in the SQL Maven Plugin to set up the database schema using a DDL file, and add some data to the database using an SQL file.