Specify common resources in a multi-module maven project

28,685

Solution 1

I'd create one additional "base" module (project), packaging "jar", that contains the common resources in src/main/resources. Then I'd make the other modules depend on that project. Now they see the common resources on their classpaths.

Solution 2

Antoher possibility is to use a remote resource bundle. You would be able to configure it in the parent project. In this example I wanted to copy some files just for tests. If you use this you will need to create the bundle in another project.

    <plugin>      
        <groupId>org.apache.maven.plugins</groupId>         
        <artifactId>maven-remote-resources-plugin</artifactId>
        <version>1.5</version>
        <configuration>
            <resourceBundles>
                <resourceBundle>es.sca:myBundle:1.0.0</resourceBundle>
            </resourceBundles>
            <attachToMain>false</attachToMain>
            <attachToTest>true</attachToTest>
            <appendedResourcesDirectory>${basedir}/src/test/resources</appendedResourcesDirectory>
        </configuration>            
        <executions>
            <execution>
                <goals>
                    <goal>process</goal>
                </goals>
            </execution>
        </executions>                   
    </plugin>                 

Solution 3

Another way, put in your project root pom:

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <!-- don't propagate to child poms -->
            <!-- this will only execute in root pom -->
            <inherited>false</inherited>
            <configuration>
                <descriptors>
                    <descriptor>assembly.xml</descriptor>
                </descriptors>
                <!-- don't add classifier -->
                <appendAssemblyId>false</appendAssemblyId>
            </configuration>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    <plugins>

And example of assembly.xml

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">

    <id>resources</id>

    <formats>
        <format>jar</format>
    </formats>

    <includeBaseDirectory>false</includeBaseDirectory>

    <fileSets>
        <fileSet>
            <directory>${project.basedir}/resources/</directory>
            <outputDirectory/>
            <useDefaultExcludes>true</useDefaultExcludes>
            <includes>
                <include>**</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

Assembly plugin will generate artifact and attach it to current reactor, so it will be installed and deployed.

No you can use it as standard dependency event in the same pom.

Important is to trigger assembly (proper phase) before another plugin which will use generated artifact.

Eg. You can have in your root pom, bellow configuration will be propagated to all your module:

              <plugin>
                <artifactId>some-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>verify</phase>
                        <goals>
                            <goal>goal</goal>
                        </goals>
                    </execution>
                </executions>
                <dependencies>
                    <dependency>
                        <groupId>your.project.groupid</groupId>
                        <artifactI>your.project.artifactId</artifactId>
                        <version>${project.version}</version>
                    </dependency>
                </dependencies>
            </plugin>

You can see this method in project: https://github.com/s4u/pgp-keys-map resources directory is shared by all module.

Solution 4

I think you can just add the resources and/or testResources elements to your pom. E.g. to access an additional test resource directory add:

    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
        </testResource>
        <testResource>
            <directory>../global/src/test/resources</directory>
        </testResource>
    </testResources>

see Maven - Override test resource folder

Solution 5

Yes, it seems as a possible solution. But I was interested whether it is possible to specify these resources in the parent project (without introducing additional module) since the parent project specifies all the common dependencies and Maven configurations for the child modules, I think that the parent project is the most suitable place also for the common resources.

In case of packaging type pom , when goal package specified to manage your shared resources, just add next (check folders) into build section of pom file :

        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
       <executions>
           <execution>
               <id>copy-config-files</id>
               <phase>package</phase>
               <goals>
                   <goal>copy-resources</goal>
               </goals>
               <configuration>
                   <outputDirectory>${project.build.directory}/logconfig</outputDirectory>
                   <resources>
                       <resource>
                        <filtering>false</filtering>
                        <directory>${project.basedir}/src/main/resources</directory>
                       </resource>
                   </resources>
               </configuration>
        </execution>
       </executions>
    </plugin>
Share:
28,685
jilt3d
Author by

jilt3d

Updated on March 08, 2020

Comments

  • jilt3d
    jilt3d about 4 years

    Is there any way to share resources between modules of a parent project in Maven? For example, I would like to specify one log4j.properties file for all the modules in a multi-module Maven project.

    Generally, I use Eclipse IDE to create the parent project by choosing a general project and then convert it to a Maven project by specifying a packaging of pom. This creates a "clean" project structure without src and etc. folders. I wonder where such a shared resource should be put in this case.

    EDIT1: I would like to put the common resources in the parent project.

  • jilt3d
    jilt3d almost 11 years
    Yes, it seems as a possible solution. But I was interested whether it is possible to specify these resources in the parent project (without introducing additional module) since the parent project specifies all the common dependencies and Maven configurations for the child modules, I think that the parent project is the most suitable place also for the common resources.
  • Andreas Dolk
    Andreas Dolk almost 11 years
    A parent project with "pom" packaging does not have any resources, it is just a build file, that can be installed/deployed as an artifact.
  • jilt3d
    jilt3d almost 11 years
    I see. So it is kind of impossible to do that with a Maven parent project? +1 but I am leaving the question yet open for a while if any other suggestions.
  • Andreas Dolk
    Andreas Dolk almost 11 years
    Yes, it won't work that way or, at least, it would break the conventions. Add dependency management, properties, repositories and all of that stuff to the parent pom but files, that need to be on the classpath while compiling, testing or later at runtime really should go into jars.
  • DevWithSigns
    DevWithSigns over 6 years
    This is not gonna work and is extremely bad practice.
  • Manmohan_singh
    Manmohan_singh over 6 years
    Can you share the code snippet of "how you are accessing the shared resources"?
  • Manoj Majumdar
    Manoj Majumdar over 2 years
    @AndreasDolk As stated in yout answer, how to make other modules depend on the base-module, I am trying that but it says cannot add module to a project which is not packaged as pom