将Java项目打包成JAR文件是Java开发过程中的一个基础且重要的环节,无论是小型工具还是大型应用,打包成JAR都能简化部署和分发流程,本文将详细介绍如何使用不同工具将Java项目打包成可执行的JAR文件,涵盖从基础命令到构建工具的完整流程。

理解JAR文件的结构与作用
JAR(Java Archive)文件是一种归档格式,它将多个Java类文件、资源文件(如配置文件、图片、音频等)和元数据信息打包成一个单独的文件,这种格式不仅便于分发,还支持压缩,可以减少文件体积,同时还能通过清单文件(META-INF/MANIFEST.MF)配置应用程序的入口点、类路径等信息,对于可执行JAR文件而言,清单文件中必须指定Main-Class属性,告诉JVM程序的启动类。
使用JDK命令行工具手动打包
对于简单的Java项目,可以直接使用JDK提供的jar命令进行打包,假设我们有一个名为HelloWorld的项目,其结构如下:
HelloWorld/
├── src/
│ └── com/
│ └── example/
│ └── HelloWorld.java
└── lib/
└── dependency.jar
步骤1:编译Java源文件
进入项目根目录,使用javac命令编译源文件,如果项目依赖外部JAR包(如lib/dependency.jar),需要通过-classpath或-cp参数指定依赖路径:
javac -cp ".;lib/dependency.jar" src/com/example/HelloWorld.java
编译完成后,会在src/com/example/目录下生成HelloWorld.class文件。
步骤2:创建MANIFEST.MF文件
在项目根目录下创建META-INF文件夹,并在其中创建MANIFEST.MF如下:
Manifest-Version: 1.0
Main-Class: com.example.HelloWorld
Class-Path: lib/dependency.jar
注意:
Main-Class的值是启动类的全限定名,且末尾不能有.class。Class-Path用于指定依赖的JAR包路径,多个路径用空格分隔,如果路径包含空格,需要使用双引号包围。
步骤3:使用jar命令打包
进入项目根目录,执行以下命令将编译后的类文件和资源文件打包成JAR:

jar cvfm HelloWorld.jar META-INF/MANIFEST.MF -C src .
命令参数说明:
c:创建新的JAR文件。v:生成详细输出,显示正在处理的文件。f:指定JAR文件名。m:包含指定的清单文件。-C src .:先切换到src目录,然后将当前目录(,即src下的所有内容)添加到JAR中。
步骤4:验证与运行
使用jar tf HelloWorld.jar命令可以查看JAR文件的内容,确认文件是否正确打包,运行JAR文件:
java -jar HelloWorld.jar
使用构建工具自动化打包
对于复杂的项目,手动打包效率低下且容易出错,此时可以使用Maven或Gradle等构建工具实现自动化打包。
(一)使用Maven打包
Maven是Java生态中最流行的构建工具之一,通过标准化的目录结构和插件简化打包流程。
步骤1:配置pom.xml
确保项目根目录下的pom.xml文件中配置了正确的打包方式和入口类。
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.example.HelloWorld</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
<packaging>jar</packaging>:指定打包类型为JAR。maven-jar-plugin:用于配置JAR文件的生成,mainClass指定启动类。
步骤2:处理依赖
如果项目依赖外部库,Maven会自动将其下载到本地仓库,可以通过maven-shade-plugin或maven-assembly-plugin将依赖直接打包到生成的JAR中,避免运行时需要手动添加类路径,以maven-assembly-plugin为例:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.example.HelloWorld</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
步骤3:执行打包命令

在项目根目录下执行以下命令:
mvn clean package
Maven会自动编译代码、处理依赖并生成JAR文件,通常位于target目录下,文件名可能为hello-world-1.0-SNAPSHOT-jar-with-dependencies.jar。
(二)使用Gradle打包
Gradle是另一种现代化的构建工具,以其灵活性和高性能受到开发者青睐。
步骤1:配置build.gradle
在项目根目录下的build.gradle文件中添加以下配置:
plugins {
id 'java'
id 'application'
}
group 'com.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation files('lib/dependency.jar') // 本地依赖
// implementation 'group:artifact:version' // Maven依赖
}
application {
mainClassName = 'com.example.HelloWorld'
}
jar {
manifest {
attributes 'Main-Class': 'com.example.HelloWorld'
}
from configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA'
}
application插件:用于配置应用程序的主类。jar任务:自定义JAR文件的生成,包括清单文件和依赖包含。
步骤2:执行打包命令
在项目根目录下执行以下命令:
gradle build
Gradle会生成JAR文件,通常位于build/libs目录下,文件名为hello-world.jar,如果需要将依赖打包进JAR,可以使用shadow插件(需先添加插件依赖)。
常见问题与解决方案
- NoClassDefFoundError:运行时找不到类,通常是因为依赖未正确添加到类路径,确保在MANIFEST.MF中正确配置
Class-Path,或使用构建工具将依赖打包进JAR。 - Main-Class not found:检查清单文件中的
Main-Class值是否正确,包括包名和类名的大小写。 - 资源文件未找到:确保资源文件位于正确的目录(如
src/main/resources),并在打包时被包含,Maven和Gradle默认会包含resources目录下的文件。
将Java项目打包成JAR文件可以通过手动命令或构建工具实现,手动打包适合简单项目,能帮助理解JAR文件的内部结构;而Maven和Gradle等构建工具则提供了自动化、可重复的打包流程,特别适合大型项目和团队协作,根据项目需求选择合适的方式,并正确配置清单文件和依赖路径,是确保JAR文件可正常运行的关键,通过掌握这些技能,开发者可以更高效地管理和分发Java应用程序。



















