Search code examples
javamavenmaven-assembly-plugin

How to prevent specifying the versions of sibling modules in maven-assembly-plugin?


The simplified setup of my project is as follows:

root |--parent |--service-1 |--service-2 |--service-aggregator

I need to assemble the 'service-1' & 'service-2' modules in 'service-aggregator'. I am using maven-assembly-plugin for the same and it works fine, however I foresee a maintenance issue wherein whenever the version of either of service-1 or service-2 will change, I will need to update the service-aggregator pom.xml also.

Hence, I am looking for a way to prevent writing the version of the service-1 / -2 in the service-aggregator pom.xml i.e. I just need service-aggregator to simply pick the latest version of service-1 / -2.

I have gone through the examples provided in maven-assembly-plugin documentation but those contain the version being mentioned in the assembly module (service-aggregator in my example).

Please let me know if any detail is missing & I will add it.

Here is the key contents of service-aggregator pom.xml:

<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>com.company.project</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1</version>
</parent>
<groupId>com.company.project.parent</groupId>
<artifactId>service-aggregator</artifactId>

<name>service-aggregator</name>
<dependencies>
    <dependency>
        <groupId>com.company.project.parent</groupId>
        <artifactId>service-1</artifactId>
        <version>0.0.1</version> <!-- this is the line troubling me -->
    </dependency>
    <dependency>
        <groupId>com.company.project.parent</groupId>
        <artifactId>service-2</artifactId>
        <version>0.0.1</version> <!-- this is the line troubling me -->
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <skipAssembly>${skip.assembly}</skipAssembly>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<properties>
    <skip.assembly>false</skip.assembly>
</properties>


Solution

  • The best thing is to use properties like this:

    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.company.project</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1</version>
    </parent>
    <groupId>com.company.project.parent</groupId>
    <artifactId>service-aggregator</artifactId>
    
    <name>service-aggregator</name>
    <dependencies>
        <dependency>
            <groupId>com.company.project.parent</groupId>
            <artifactId>service-1</artifactId>
            <version>${project.version}</version> 
        </dependency>
        <dependency>
            <groupId>com.company.project.parent</groupId>
            <artifactId>service-2</artifactId>
            <version>${project.version}</version> 
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <skipAssembly>${skip.assembly}</skipAssembly>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>