JAR(Java Archive)是 Java 平台用于打包多个 Java 类文件、相关元数据和资源(如图片、配置文件等)到一个归档文件中的工具。JAR 文件基于 ZIP 格式,通常用于分发 Java 库、应用程序或组件。本文将详细介绍 jar 命令的使用方法,并汇总常见问题及解决方案。


一、JAR 命令基础

jar 命令是 JDK 自带的命令行工具,位于 $JAVA_HOME/bin/jar。其基本语法如下:

jar [选项] [目标 JAR 文件名] [输入文件/目录...]

常用选项说明:

选项 说明
-c 创建新的 JAR 文件
-t 列出 JAR 文件内容
-x 解压 JAR 文件
-u 更新已存在的 JAR 文件
-v 详细输出(显示处理过程)
-f 指定 JAR 文件名(必须与 -c-t-x-u 一起使用)
-m 包含指定的 MANIFEST.MF 文件
-e 指定主类(用于可执行 JAR)

⚠️ 注意:从 Java 9 开始,jar 命令支持模块化(--module-version 等),但本文主要面向传统 JAR 使用场景。


二、常用操作示例

1. 创建 JAR 文件

将当前目录下的所有 .class 文件打包成 app.jar

jar -cvf app.jar *.class
  • -c:创建
  • -v:显示详细过程
  • -f:指定文件名

2. 创建包含目录结构的 JAR

假设项目结构如下:

com/
└── example/
    └── MyApp.class

打包整个目录:

jar -cvf mylib.jar com/

3. 创建可执行 JAR(带主类)

方式一:使用 -e 指定主类(Java 6+ 支持):

jar -cvfe myapp.jar com.example.MainApp com/

其中:

  • -e com.example.MainApp:指定主类
  • com/:要打包的目录

方式二:手动编写 MANIFEST.MF 文件

创建 manifest.txt

Main-Class: com.example.MainApp

注意:最后一行必须为空行!

然后执行:

jar -cvfm myapp.jar manifest.txt com/

4. 查看 JAR 内容

jar -tvf app.jar

输出类似:

   567 Fri Nov 01 10:00:00 CST 2025 com/example/MyApp.class
   123 Fri Nov 01 10:00:00 CST 2025 config.properties

5. 解压 JAR 文件

jar -xvf app.jar

会将内容解压到当前目录。

6. 更新 JAR 文件

向已有 JAR 中添加新文件:

jar -uvf app.jar newfile.txt

三、MANIFEST.MF 文件详解

META-INF/MANIFEST.MF 是 JAR 的元数据文件,位于 JAR 内部的 META-INF/ 目录中。常见字段:

  • Main-Class: 指定可执行 JAR 的入口类
  • Class-Path: 指定依赖的其他 JAR 或路径(路径相对于 JAR 所在目录)
  • Created-By: 创建者信息
  • Implementation-Version: 实现版本

示例:

Manifest-Version: 1.0
Main-Class: com.example.Launcher
Class-Path: lib/commons-lang3-3.12.0.jar lib/log4j-api-2.17.0.jar
Created-By: 17.0.8 (Oracle Corporation)

📌 注意:

  • 每行不能超过 72 个字符,超长需用空格续行
  • Class-Path 中的路径不能包含 file:// 或绝对路径

四、常见问题与解决方案

❓ 1. 运行 JAR 时报错:“no main manifest attribute”

原因:JAR 文件缺少 Main-Class 配置。

解决

  • 确保打包时指定了主类(使用 -e-m
  • 检查 MANIFEST.MF 是否包含 Main-Class: 全限定类名
  • 确认 MANIFEST.MF 最后一行是空行

❓ 2. 运行时提示 “Could not find or load main class”

可能原因

  • 主类路径错误(包名或类名拼写错误)
  • 类未包含在 JAR 中
  • 类路径(Class-Path)依赖缺失

排查步骤

jar -tvf myapp.jar | grep MainApp

确认类是否存在。

❓ 3. JAR 依赖的外部库找不到

解决

  • MANIFEST.MF 中正确配置 Class-Path
  • 或使用 -cp 手动指定类路径运行:
java -cp "myapp.jar:lib/*" com.example.MainApp

Windows 下路径分隔符用 ;,Linux/macOS 用 :

❓ 4. 如何查看 JAR 的 MANIFEST 内容?

jar -xf myapp.jar META-INF/MANIFEST.MF
cat META-INF/MANIFEST.MF

或直接:

unzip -p myapp.jar META-INF/MANIFEST.MF

❓ 5. 能否将多个 JAR 合并成一个?

不推荐直接合并,因为可能造成类冲突或签名问题。

推荐方案

  • 使用构建工具(如 Maven 的 maven-shade-plugin 或 Gradle 的 shadow 插件)创建“fat jar”
  • 或通过 Class-Path 引用多个 JAR

五、最佳实践建议

  1. 始终使用构建工具(如 Maven、Gradle)管理 JAR 打包,避免手动操作出错。
  2. 可执行 JAR 尽量包含所有依赖(fat jar)或明确声明 Class-Path
  3. 避免在 MANIFEST 中使用绝对路径
  4. 测试 JAR 可执行性java -jar your-app.jar
  5. 签名 JAR(如用于 Applet 或安全环境)使用 jarsigner 工具。

六、附录:常用命令速查

功能 命令
创建 JAR jar -cvf app.jar *.class
创建可执行 JAR jar -cvfe app.jar com.example.MainApp .
查看内容 jar -tvf app.jar
解压 JAR jar -xvf app.jar
更新 JAR jar -uvf app.jar newfile.txt
指定 MANIFEST jar -cvfm app.jar manifest.txt .

🙌 感谢你读到这里!
🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。
💡 如果本文对你有帮助,不妨 👍 点赞、📌 收藏、📤 分享 给更多需要的朋友!
💬 欢迎在评论区留下你的想法、疑问或建议,我会一一回复,我们一起交流、共同成长 🌿
🔔 关注我,不错过下一篇干货!我们下期再见!✨

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐