在 Java 开发中,有时需要将代码打包成一个可执行的 JAR 文件以便于部署和分发。然而,通常情况下,项目依赖的外部库并不会自动打包到这个 JAR 文件中。这时,我们需要将所有依赖一起打包到一个“fat JAR”或“uber JAR”中。本文将介绍如何使用 Maven 的 maven-assembly-plugin 插件将所有依赖打包到一个可执行的 JAR 文件中。
什么是 Maven Assembly Plugin?
maven-assembly-plugin 是 Maven 的一个插件,用于将项目的类文件、依赖库以及资源文件一起打包成一个单独的可执行文件。这个插件的灵活性非常高,可以根据不同的需求生成不同类型的打包格式,如包含依赖的 JAR、ZIP、TAR 文件等。
为什么需要打包所有依赖?
在某些场景下,我们希望项目的 JAR 文件能够独立运行,而不必依赖外部的库或其他 JAR 文件。这对于分发和部署非常重要,特别是在需要将应用程序传递给不熟悉项目结构的用户时,一个包含所有依赖的可执行 JAR 文件能够避免依赖缺失的问题。
配置 Maven Assembly Plugin
要使用 maven-assembly-plugin 生成一个包含所有依赖的 JAR 文件,你需要在项目的 pom.xml 文件中进行如下配置:
1 | <build> |
关键配置项详解
mainClass:
在<manifest>中配置的mainClass是项目的入口类,即包含public static void main(String[] args)方法的类。当用户运行这个 JAR 文件时,JVM 会使用这个类作为程序的入口。如果没有指定,生成的 JAR 文件将无法直接运行。descriptorRef:<descriptorRef>jar-with-dependencies</descriptorRef>是一个预定义的描述符,表示我们希望将所有项目的依赖库都打包到 JAR 文件中。通过这种方式,JAR 文件将不仅包含项目自身的代码,还会包含所有的依赖库,从而成为一个独立的可执行文件。executions:<executions>定义了插件的执行行为。<phase>指定了在 Maven 构建生命周期的哪个阶段执行该插件。这里配置的package阶段表示在项目打包时执行这个插件,生成包含所有依赖的 JAR 文件。<goal>设置为single,意味着要根据前面的配置生成单一的程序集(JAR 文件)。
打包和运行
在项目根目录下,运行以下命令来进行打包:
1 | mvn clean package |
运行后,你会在 target 目录下找到一个名称类似 your-artifact-id-jar-with-dependencies.jar 的 JAR 文件。这个 JAR 文件已经包含了所有的项目依赖,可以独立运行。
运行命令如下:
1 | java -jar target/your-artifact-id-jar-with-dependencies.jar |
总结
通过 Maven 的 maven-assembly-plugin,我们可以方便地将 Java 项目及其所有依赖打包成一个可执行的 JAR 文件。这种方式极大地简化了项目的分发和部署流程,使得 Java 应用程序可以更加便捷地在不同环境中运行。