Jar 参考文档 #

1. 什么是JAR文件 #

JAR(Java Archive)文件是一种基于ZIP格式的归档文件,用于封装Java类文件、资源文件和元数据。JAR文件提供了以下优点:

  • 跨平台性:遵循Java的"一次编写,到处运行"原则
  • 压缩存储:减少文件大小,提高传输效率
  • 简化部署:将多个文件打包为单一文件
  • 版本控制:通过清单文件记录版本信息
  • 安全性:支持数字签名验证

2. JAR命令行工具 #

JDK提供了jar命令行工具,用于创建、查看、提取和更新JAR文件。

2.1 基本语法 #

bash
jar [选项] [参数]

2.2 常用选项 #

选项 说明
c 创建新的JAR文件
t 列出JAR文件内容
x 提取JAR文件内容
u 更新现有的JAR文件
v 生成详细输出(verbose)
f 指定JAR文件名
m 包含指定的清单文件内容
M 不生成默认清单文件
C 更改目录并包含文件
i 为JAR文件生成索引信息
e 指定应用程序入口点

3. JAR文件操作 #

3.1 创建JAR文件 #

创建基本JAR文件

bash
jar cf myapp.jar *.class

创建带详细输出的JAR文件

bash
jar cvf myapp.jar *.class

从指定目录创建JAR文件

bash
jar cvf myapp.jar -C build/classes .

创建包含资源文件的JAR文件

bash
jar cvf myapp.jar *.class images/ config/

3.2 查看JAR文件内容 #

列出JAR文件内容

bash
jar tf myapp.jar

列出带详细信息的JAR文件内容

bash
jar tvf myapp.jar

搜索特定文件

bash
jar tf myapp.jar | grep "Main"

3.3 提取JAR文件内容 #

提取所有内容

bash
jar xf myapp.jar

提取特定文件

bash
jar xf myapp.jar com/example/Main.class

提取带详细输出

bash
jar xvf myapp.jar

3.4 更新JAR文件 #

添加新文件

bash
jar uf myapp.jar newfile.class

从目录添加文件

bash
jar uf myapp.jar -C resources/ .

4. 可执行JAR文件 #

可执行JAR文件允许直接通过java -jar命令运行应用程序,无需单独指定主类。

4.1 创建可执行JAR文件 #

方法1:使用-e选项指定入口点

bash
jar cfe myapp.jar com.example.Main *.class

方法2:使用清单文件

  1. 创建清单文件manifest.txt
txt
Main-Class: com.example.Main
  1. 创建JAR文件:
bash
jar cfm myapp.jar manifest.txt *.class

4.2 运行可执行JAR文件 #

bash
java -jar myapp.jar

5. 清单文件(MANIFEST.MF) #

清单文件是JAR文件中的特殊文件(位于META-INF/MANIFEST.MF),用于存储JAR文件的元数据。

5.1 基本清单文件结构 #

txt
Manifest-Version: 1.0
Created-By: 17.0.1 (Oracle Corporation)

5.2 常用清单属性 #

属性 说明
Manifest-Version 清单文件版本
Main-Class 应用程序入口类
Class-Path 依赖的JAR文件路径
Created-By 创建JAR文件的JDK版本
Implementation-Title 应用程序标题
Implementation-Version 应用程序版本
Implementation-Vendor 应用程序供应商
Sealed 是否密封JAR文件
Signature-Version 签名版本

5.3 创建自定义清单文件 #

示例:带有依赖的清单文件

txt
Manifest-Version: 1.0
Main-Class: com.example.Main
Class-Path: lib/dependency1.jar lib/dependency2.jar
Implementation-Title: My Application
Implementation-Version: 1.0.0

6. JAR文件签名 #

JAR文件支持数字签名,用于验证文件的完整性和真实性。

6.1 生成密钥对 #

bash
keytool -genkeypair -alias mykey -keystore mykeystore.jks

6.2 签名JAR文件 #

bash
jarsigner myapp.jar mykey -keystore mykeystore.jks

6.3 验证JAR文件签名 #

bash
jarsigner -verify myapp.jar

7. 高级用法 #

7.1 创建模块化JAR文件 #

创建模块描述符module-info.java

java
module com.example.myapp {
    requires java.base;
    requires java.sql;
    exports com.example;
}

编译并创建模块化JAR

bash
javac --module-source-path src -d out $(find src -name "*.java")
jar --create --file myapp.jar --main-class com.example.Main -C out/com.example.myapp .

7.2 多版本JAR文件 #

支持在单个JAR文件中包含不同Java版本的类:

bash
jar cfe myapp.jar com.example.Main --release 8 classes/8 --release 11 classes/11

7.3 JAR文件优化 #

使用jlink创建自定义运行时镜像:

bash
jlink --module-path $JAVA_HOME/jmods:myapp.jar --add-modules com.example.myapp --output myapp-image

8. 最佳实践 #

  1. 使用有意义的JAR文件名:包含应用程序名称和版本信息
  2. 保持JAR文件简洁:只包含必要的文件
  3. 使用清单文件管理元数据:特别是主类和类路径
  4. 签名重要的JAR文件:确保安全性和完整性
  5. 考虑模块化设计:使用Java模块系统提高可维护性
  6. 使用构建工具:如Maven、Gradle自动处理JAR文件创建
  7. 文档化JAR文件内容:使用README或文档说明JAR文件的用途和用法

9. 常见问题 #

9.1 JAR文件无法运行 #

  • 检查Main-Class属性是否正确设置
  • 确保所有依赖都在类路径中
  • 验证JAR文件的完整性

9.2 类找不到错误 #

  • 检查类路径设置
  • 确保所需的依赖JAR文件可用
  • 验证包名和类名是否正确

9.3 JAR文件大小过大 #

  • 移除不必要的文件和依赖
  • 使用ProGuard等工具进行代码混淆和优化
  • 考虑使用模块化设计减少依赖

10. 相关工具 #

  • Maven:自动化构建工具,简化JAR文件创建
  • Gradle:灵活的构建工具,支持JAR文件创建和发布
  • Ant:传统构建工具,通过任务创建JAR文件
  • jpackage:将JAR文件打包为平台特定的安装程序
  • ProGuard:代码混淆和优化工具

11. 总结 #

JAR文件是Java应用程序部署和分发的核心机制。通过本文档,您应该已经了解了如何使用JAR命令行工具创建、管理和使用JAR文件,以及如何利用清单文件和签名功能增强JAR文件的功能和安全性。

无论您是开发简单的命令行应用程序还是复杂的企业级系统,掌握JAR文件的使用都是Java开发人员的必备技能。

最后更新:2026-02-05