Maven Assembly Plugin is a powerful plugin provided by Maven for creating custom distributions. It allows developers to package projects and their dependencies into various formats such as ZIP, TAR, GZ, etc., meeting different distribution needs.
Role of Assembly Plugin:
- Create distributable software packages
- Package projects and all their dependencies
- Support custom file structures and layouts
- Generate multiple compression formats
- Create executable startup scripts
Configuring Assembly Plugin:
- Add Plugin Dependency:
xml<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.4.2</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.Main</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
- Use Predefined Descriptors:
jar-with-dependencies: JAR package containing all dependenciesbin: Binary distribution packagesrc: Source code distribution packageproject: Project distribution package
Custom Assembly Descriptor:
Create src/assembly/distribution.xml file:
xml<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 https://maven.apache.org/xsd/assembly-2.1.0.xsd"> <id>distribution</id> <formats> <format>zip</format> <format>tar.gz</format> </formats> <includeBaseDirectory>true</includeBaseDirectory> <baseDirectory>${project.artifactId}-${project.version}</baseDirectory> <fileSets> <fileSet> <directory>src/main/scripts</directory> <outputDirectory>bin</outputDirectory> <fileMode>0755</fileMode> </fileSet> <fileSet> <directory>src/main/config</directory> <outputDirectory>conf</outputDirectory> </fileSet> </fileSets> <dependencySets> <dependencySet> <outputDirectory>lib</outputDirectory> <useProjectArtifact>true</useProjectArtifact> <scope>runtime</scope> </dependencySet> </dependencySets> </assembly>
Reference Custom Descriptor in POM:
xml<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.4.2</version> <configuration> <descriptors> <descriptor>src/assembly/distribution.xml</descriptor> </descriptors> </configuration> </plugin>
Core Elements of Assembly Descriptor:
- formats: Define output formats (zip, tar, tar.gz, jar, war, etc.)
- fileSets: Define file sets, including source files and target directories
- dependencySets: Define dependency sets, including dependency output directories and scopes
- files: Define individual files
- moduleSets: Define module sets for multi-module projects
Create Executable JAR:
xml<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.Main</mainClass> </manifest> </archive> </configuration> </plugin>
Create Startup Scripts:
Create startup scripts in the src/main/scripts directory:
start.sh (Unix/Linux):
bash#!/bin/bash APP_HOME=$(cd "$(dirname "$0")"; pwd) java -jar $APP_HOME/lib/${project.artifactId}-${project.version}.jar
start.bat (Windows):
batch@echo off set APP_HOME=%~dp0 java -jar %APP_HOME%lib\${project.artifactId}-${project.version}.jar
Using Assembly Plugin:
bashmvn clean package
The generated distribution packages are located in the target directory.
Best Practices:
- Use custom descriptors to meet specific needs
- Reasonably organize file structure for easy user use
- Include README and LICENSE files
- Set correct file permissions (fileMode)
- Use Profile to distinguish distribution packages for different environments
- Automate distribution package creation in CI/CD processes
- Regularly test the usability of distribution packages
Common Issue Resolution:
- Dependency Conflicts: Use
<excludes>to exclude unwanted dependencies - File Permissions: Set correct file modes in Unix systems
- Path Issues: Use relative paths to ensure cross-platform compatibility
- Package Size: Use
<useTransitiveFiltering>to control dependency scope
Maven Assembly Plugin is a powerful tool for creating professional distribution packages, capable of meeting various complex distribution needs.