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.PropertiesLauncherJarLauncher

如果你希望自定义主类,可以在 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 和主类路径,务必注意格式和换行!


原始标题:Guide to Creating and Running a Jar File in Java | Baeldung