引言:JAR 包打包的困扰与重要性
写完代码只是万里长征的第一步,如何将代码打包成一个'开箱即用'的 JAR 文件,才是交付的关键一步。不少 Java 开发者都有过这样的经历:本地运行得好好的程序,兴高采烈地打包后,满心欢喜地准备部署,结果一运行,报错 ClassNotFoundException!这时候先别慌,大概率不是代码出了岔子,而是 JAR 包没打好。
在 Java 开发中,JAR(Java Archive)包是一种非常常见的文件格式,它可以将多个 Java 类文件及其相关元数据和资源(如图像和库)打包成单一文件,方便分发和部署。而对于 Maven 项目来说,打可执行 JAR 包有多种方式。今天,我们就来深入对比三种主流方案:maven-jar-plugin(轻量外置依赖)、maven-assembly-plugin(全家桶打包)和 maven-shade-plugin(高级防冲突版)。每种方式都会附上真实的 pom.xml 配置、执行命令以及输出结构,让大家看完就能轻松上手。
方式一:maven-jar-plugin,轻量但依赖外置
原理剖析
maven-jar-plugin 是 Maven 的一个内置插件,主要用于将项目编译后的 class 文件及相关资源打包成 JAR 文件。不过,它打包时仅包含项目自身的代码和资源,第三方依赖则不会被打包进去。那运行时如何找到这些依赖呢?它通过在 MANIFEST.MF 文件中指定依赖的路径,让 JVM 在运行时能从指定位置加载依赖。就好比你搬家时,只带走了自己的行李,而家具等大件物品则在新家附近的仓库放着,然后在入住清单上写清楚了仓库的位置,这样入住时就能顺利取到家具。
pom.xml 配置详解
在 pom.xml 文件中,需要进行如下配置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>org.example.App</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>dependencies/
org.apache.maven.plugins
maven-dependency-plugin
3.1.1
package
copy-dependencies
${project.build.directory}/dependencies/
runtime

