How to configure Maven shade plugin in a multi-module project?
You MainModule
is not supposed to produce a jar file. It can produce only... pom files. It contains configuration shared across all it child modules. This is why the shade plugin is called against each modules.
Instead, create a third module. Let's call it FinalModule
. This module is a child of MainModule
. Move the whole <build>
node from MainModule
pom.xml to FinalModule
pom.xml.
File structure:
MainModule -FinalModule -src -pom.xml -Module1 -src -pom.xml -Module2 -src -pom.xml -pom.xml
The FinalModule
pom.xml
looks like this:
FinalModule (pom.xml)
<parent>
<groupId>com.plugintest</groupId>
<artifactId>MainModule</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>FinalModule</artifactId>
<dependencies>
<dependency>
<groupId>com.plugintest</groupId>
<artifactId>Module1</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.plugintest</groupId>
<artifactId>Module2</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
In the end, you should get something like this:
[INFO]
[INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ FinalModule ---
[INFO] Building jar: D:\workspaces\java\Parent\FinalModule\target\FinalModule-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-shade-plugin:2.2:shade (default) @ FinalModule ---
[INFO] Including my:Module1:jar:1.0-SNAPSHOT in the shaded jar.
[INFO] Including my:Module2:jar:1.0-SNAPSHOT in the shaded jar.
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing D:\workspaces\java\Parent\FinalModule\target\FinalModule-1.0-SNAPSHOT.jar with D:\workspaces\java\Parent\FinalModule\target\FinalModule-1.0-SNAPSHOT-shaded.jar
[INFO] Dependency-reduced POM written at: D:\workspaces\java\Parent\FinalModule\dependency-reduced-pom.xml
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] Parent ............................................ SUCCESS [0.016s]
[INFO] Module1 ........................................... SUCCESS [1.654s]
[INFO] Module2 ........................................... SUCCESS [0.343s]
[INFO] FinalModule ....................................... SUCCESS [0.953s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
Related videos on Youtube
nightin_gale
Updated on October 15, 2022Comments
-
nightin_gale over 1 year
I have been trying to get jar using Maven Shade Plugin, but I still don't get a success.
This is my project structure:
MainModule -Module1 -src -pom.xml -Module2 -src -pom.xml -pom.xml
Module1 (pom.xml):
<parent> <artifactId>MainModule</artifactId> <groupId>com.plugintest</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>Module1</artifactId>
Module2 (pom.xml):
<parent> <artifactId>MainModule</artifactId> <groupId>com.plugintest</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>Module1</artifactId>
MainModule (pom.xml):
<groupId>com.plugintest</groupId> <artifactId>MainModule</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>Module1</module> <module>Module2</module> </modules> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.2</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
According this code I get 2 jar-files (Module1-version.jar and Module2-version.jar). But it is not what I want. I wish to get 1 jar file (MainModule-version.jar), which would contain the other (Module1 and Module2).
Why doesn't this Shade Plugin work?
-
Andy over 8 yearsI take back my previous comments...I was confused/frustrated because I thought this approach requires using
<parent>
pom links. Thankfully, it doesn't; even without them, the module containing the shade config will output the shaded jar when you runmvn install
on the aggregation pom.