25

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?

1
  • Your Module2 is labeled "Module1" in the code snippets above. ... Commented Jan 16, 2015 at 0:41

1 Answer 1

27

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] ------------------------------------------------------------------------ 
Sign up to request clarification or add additional context in comments.

1 Comment

I 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 run mvn install on the aggregation pom.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.