JAR 命令实用教程与常见问题
本文详细介绍了Java归档工具JAR文件的基础知识和常用操作。主要内容包括:JAR命令的基本语法和常用选项说明;创建普通JAR文件、可执行JAR(带主类)以及包含目录结构JAR的具体方法;如何查看和解压JAR内容;MANIFEST.MF元数据文件的关键字段和编写规范。文章还针对"no main manifest attribute"等常见问题提供了解决方案,并给出了使用构建工具
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
五、最佳实践建议
- 始终使用构建工具(如 Maven、Gradle)管理 JAR 打包,避免手动操作出错。
- 可执行 JAR 尽量包含所有依赖(fat jar)或明确声明
Class-Path。 - 避免在 MANIFEST 中使用绝对路径。
- 测试 JAR 可执行性:
java -jar your-app.jar - 签名 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 . |
🙌 感谢你读到这里!
🔍 技术之路没有捷径,但每一次阅读、思考和实践,都在悄悄拉近你与目标的距离。
💡 如果本文对你有帮助,不妨 👍 点赞、📌 收藏、📤 分享 给更多需要的朋友!
💬 欢迎在评论区留下你的想法、疑问或建议,我会一一回复,我们一起交流、共同成长 🌿
🔔 关注我,不错过下一篇干货!我们下期再见!✨
更多推荐


所有评论(0)