Complicated Maven assembly
-
04-10-2019 - |
Question
I'm trying to write a maven assembly and I'm not sure how to continue. It's fairly complicated, so the examples I google don't really help. This is what I'm trying to do:
- Create an installation file using launch4j. This part works, assuming the jar file is correctly assembled (hence the need for a maven assembly.)
- The installation program contains some dependencies. These are assembled (currently) using the
jar-with-dependencies
descriptorRef
. This works as well. - I need to include a war file (from another project) into the big jar. This is my confusion.
How do I create an assembly.xml
that will do both the jar with dependencies (unpacking all of those jar files) and include a war file from another project (which is not unpacked).
Any help would be appreciated.
Solution
How do I create an assembly.xml that will do both the jar with dependencies (unpacking all of those jar files) and include a war file from another project (which is not unpacked).
Assuming you have a project structure similar to the one below (I'm assuming a simple structure since you didn't mention anything particular about it):
. ├── pom.xml └── src ├── main │ ├── assembly │ │ └── uberjar.xml │ └── java │ └── com │ └── stackoverflow │ └── App.java └── test └── java └── com └── stackoverflow └── AppTest.java
With the following pom.xml:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.stackoverflow</groupId>
<artifactId>Q3762049</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- this is the war we want to include in the assembly -->
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>my-webapp</artifactId>
<version>1.0-SNAPSHOT</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
<!-- and below, the other dependencies -->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.4</version>
</dependency>
...
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/uberjar.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
As you can see,
- We are not going to use the predefined
jar-with-dependencies
descriptor here, we are going to reuse it in our own custom assembly descriptor. - We have a dependency declared on the war with a
runtime
scope so that we'll be able to include it in the assembly.
And now, the custom uberjar.xml
:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>uberjar</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<unpack>true</unpack>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
<excludes>
<exclude>*:war</exclude>
</excludes>
</dependencySet>
<dependencySet>
<unpack>false</unpack>
<scope>runtime</scope>
<useProjectArtifact>false</useProjectArtifact>
<includes>
<include>*:war</include>
</includes>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.outputDirectory}</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
This is a little variation of the jar-with-dependencies
descriptor that will create a jar:
- the dependencies except the war, unpacked
- the war of the webapp, not unpacked
- the classes from the project itself
As shown below:
$ mvn clean package [INFO] Scanning for projects... ... $ cd target; jar xvf Q3762049-1.0-SNAPSHOT-uberjar.jar created: META-INF/ inflated: META-INF/MANIFEST.MF created: org/ created: org/apache/ created: org/apache/commons/ created: org/apache/commons/lang/ created: org/apache/commons/lang/builder/ created: org/apache/commons/lang/enum/ created: org/apache/commons/lang/enums/ created: org/apache/commons/lang/exception/ created: org/apache/commons/lang/math/ created: org/apache/commons/lang/mutable/ created: org/apache/commons/lang/text/ created: org/apache/commons/lang/time/ inflated: META-INF/LICENSE.txt inflated: META-INF/NOTICE.txt inflated: org/apache/commons/lang/ArrayUtils.class ... created: META-INF/maven/ created: META-INF/maven/commons-lang/ created: META-INF/maven/commons-lang/commons-lang/ inflated: META-INF/maven/commons-lang/commons-lang/pom.xml inflated: META-INF/maven/commons-lang/commons-lang/pom.properties inflated: my-webapp-1.0-SNAPSHOT.war created: com/ created: com/stackoverflow/ inflated: com/stackoverflow/App.class