1. 概述
在 Java 开发中,将多个 .class
文件打包成一个归档文件(即 JAR 文件)是一种常见的做法。
本文将带你全面了解 Java 中 JAR(Java Archive)文件的创建与运行方式。我们将从一个简单的 Java 应用入手,演示多种打包和运行 JAR 的方法,并顺带解答一些常见问题,比如:✅ 如何快速查看 JAR 包中的 MANIFEST.MF
文件。
2. 准备一个 Java 程序
在创建可运行的 JAR 文件之前,我们的程序必须包含一个带有 main
方法的类,作为程序入口:
public static void main(String[] args) {
System.out.println("Hello Baeldung Reader!");
}
3. 使用 jar 命令打包
在准备好 .class
文件之后,我们可以使用 jar
命令来打包。
首先,使用 javac
编译源文件:
javac com/baeldung/jar/*.java
编译完成后,会在 com/baeldung/jar/
目录下生成 .class
文件。接下来就可以打包了。
3.1. 使用默认方式打包
使用 jar
命令创建 JAR 文件时,常用参数如下:
c
:创建新的归档文件f
:指定输出的文件名
jar cf JarExample.jar com/baeldung/jar/*.class
⚠️ 注意:这种方式打包的 JAR 文件默认不可直接运行,因为没有指定入口类。
3.2. 指定主类(Main-Class)
为了让 JAR 文件可以直接运行,我们需要在 MANIFEST.MF
文件中指定主类。
使用 e
参数可以快速指定入口类,jar
命令会自动写入 MANIFEST.MF
:
jar cfe JarExample.jar com.baeldung.jar.JarExample com/baeldung/jar/*.class
✅ 这样打包出来的 JAR 文件就是可执行的。
3.3. 更新已有的 JAR 文件内容
如果我们修改了某个类并重新编译,可以使用 u
参数更新 JAR 文件:
jar uf JarExample.jar com/baeldung/jar/JarExample.class
3.4. 使用自定义 MANIFEST 文件
有时候我们需要在 MANIFEST.MF
中添加额外信息,比如版本号、依赖等。
可以创建一个自定义的 manifest 文件,比如 example_manifest.txt
:
Main-Class: com.baeldung.jar.JarExample
⚠️ 重要:manifest 文件必须以换行符结尾,否则会被忽略!
然后使用 m
参数指定该文件:
jar cfm JarExample.jar com/baeldung/jar/example_manifest.txt com/baeldung/jar/*.class
3.5. 显示详细信息(Verbose 模式)
使用 -v
参数可以让 jar
命令输出详细过程:
jar cvfm JarExample.jar com/baeldung/jar/example_manifest.txt com/baeldung/jar/*.class
added manifest
adding: com/baeldung/jar/JarExample.class(in = 453) (out= 312)(deflated 31%)
4. 使用 Maven 打包
4.1. 默认打包方式
Maven 遵循“约定优于配置”的原则,只需运行:
mvn package
即可在 target/
目录下生成 JAR 文件。
4.2. 指定主类
为了让 Maven 生成的 JAR 可执行,我们需要配置 maven-jar-plugin
插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
<configuration>
<archive>
<manifest>
<mainClass>com.baeldung.jar.JarExample</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
✅ 这样打出来的 JAR 文件就可以直接运行了。
5. 使用 Spring Boot 打包
5.1. 默认方式
如果你使用的是 Spring Boot 项目,确保 pom.xml
中的打包方式是 jar
:
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-boot</artifactId>
<packaging>jar</packaging>
<name>spring-boot</name>
然后执行:
mvn package
5.2. 设置入口类
Spring Boot 项目生成的是“Fat Jar”,其入口类通常是 org.springframework.boot.loader.PropertiesLauncher
或 JarLauncher
。
如果你希望自定义主类,可以在 pom.xml
中指定:
<properties>
<start-class>com.baeldung.jar.JarExample</start-class>
</properties>
⚠️ 注意:这个配置只在 Spring Boot 项目中有效。
6. 运行 JAR 文件
有了 JAR 文件之后,就可以运行它了。
6.1. 自动识别主类
如果 MANIFEST.MF
中已经指定了 Main-Class
,我们只需要使用 -jar
参数运行:
java -jar JarExample.jar
6.2. 手动指定主类
也可以通过 -cp
指定 classpath,然后手动指定主类:
java -cp JarExample.jar com.baeldung.jar.JarExample
或者使用文件路径格式(效果相同):
java -cp JarExample.jar com/baeldung/jar/JarExample
6.3. 查看 JAR 内容
使用 jar
命令可以列出 JAR 文件中的所有内容:
jar tf JarExample.jar
META-INF/
META-INF/MANIFEST.MF
com/baeldung/jar/JarExample.class
6.4. 查看 MANIFEST 文件
可以通过 unzip
命令快速查看 MANIFEST.MF
内容:
unzip -p JarExample.jar META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.8.0_31 (Oracle Corporation)
Main-Class: com.baeldung.jar.JarExample
✅ 这个方法非常实用,尤其在排查 JAR 启动失败时。
7. 总结
在这篇文章中,我们:
- 从零开始构建了一个带有
main
方法的 Java 程序 - 使用
jar
命令、Maven 和 Spring Boot 三种方式创建了 JAR 文件 - 展示了如何运行 JAR,并查看其内容和
MANIFEST.MF
文件
相关的示例代码:
📌 提示:JAR 文件虽小,但配置不对就容易踩坑,尤其是 MANIFEST.MF
和主类路径,务必注意格式和换行!