将maven项目使用shade插件生成独立jar包

目前使用maven构建java项目的确很容易,主要是因为maven能帮助我们解决第三方包依赖的问题。但在部署时,由于java包依赖的问题 又让事情变得有些复杂。因此,这里介绍一下如何使用maven的shade插件将依赖的class文件打包在一个jar包中,方便部署与运行。

工程的pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>xyz.bezalel.nebula</groupId>
    <artifactId>app</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <!--这边设置你所依赖的包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <!--此处是对shade插件的配置-->
                <configuration>
                    <transformers>
                        <!--定义jar包的执行类-->
                        <transformer
                            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <!--MANIFEST.MF 文件追加的内容-->
                            <manifestEntries>
                                <Main-Class>xyz.bezalel.nebula.MainApp</Main-Class>
                            </manifestEntries>
                        </transformer>
                        <!--合并各个jar包中的 META-INF/services-->
                        <transformer
                            implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                    </transformers>
                    <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

shade插件中有各种的transformer用于对最终生成的jar包进行调整设置,具体的可查看 transformer的定义,所有的配置参数克查看configuration的定义

独立maven项目的编译与打包

和常规的maven项目类似,采用常规的package命令即可生成独立jar包,根据这个配置文件会在target目录中生成app-1.0.0-fat.jar文件,这是可独立执行的jar包。

mvn clean compile package

总结及说明

将java打包成独立的jar包,能够给部署带来很多的便捷性,但在执行环境中依然需要安装jre。