JDK 工具学习系列(二):jar 命令实用教程与常见问题

JDK 工具学习系列(二):jar 命令实用教程与常见问题

本文记录了我在 Windows PowerShell 下学习 JDK 自带 jar 命令的全过程,包括实际操作、遇到的问题和官方说明,适合 Java 初学者参考。


0. 官方命令说明

  • jar - create an archive for classes and resources, and manipulate or restore individual classes or resources from an archive

1. 基础操作流程

1.1 编写并编译 Java 程序

新建 HelloJar.java

java 复制代码
public class HelloJar {
    public static void main(String[] args) {
        System.out.println("Hello from JAR!");
    }
}

编译生成 class 文件:

powershell 复制代码
javac HelloJar.java

1.2 创建 jar 包

powershell 复制代码
jar cf HelloJar.jar HelloJar.class
  • c:创建(create)
  • f:指定 jar 文件名(file)
  • HelloJar.jar:生成的 jar 包名
  • HelloJar.class:要打包的 class 文件

1.3 查看 jar 包内容

powershell 复制代码
jar tf HelloJar.jar

输出示例:

arduino 复制代码
META-INF/
META-INF/MANIFEST.MF
HelloJar.class

jar 包会自动包含 META-INF/ 目录和 MANIFEST.MF 文件。


2. 创建可执行 jar 包

2.1 新建 manifest 文件

新建 manifest.txt,内容如下(注意最后有一个空行):

css 复制代码
Main-Class: HelloJar

2.2 打包为可执行 jar

powershell 复制代码
jar cfm HelloJar-exec.jar manifest.txt HelloJar.class
  • m:指定 manifest 文件

2.3 运行可执行 jar 包

powershell 复制代码
java -jar HelloJar-exec.jar

输出:

csharp 复制代码
Hello from JAR!

3. 常见问题与解决

3.1 no main manifest attribute, in HelloJar-exec.jar

原因: manifest 文件最后一行没有空行,导致 Main-Class 属性未被正确识别。

解决: manifest.txt 最后一行必须有换行符。


3.2 manifest 重复警告

当用 jar ufm 更新 manifest 时,可能出现:

vbnet 复制代码
WARNING: Duplicate name in Manifest: Main-Class.

原因: jar 包里已有 manifest,再次添加会有重复属性。

影响:

  • 通常不会影响 jar 包运行,最终 manifest 只保留一个 Main-Class
  • 建议 manifest 有变动时用 jar cfm ... 重新打包,保持结构干净。

3.3 只更新 class 文件

如果 manifest 没变,只是 class 文件有变动,直接用:

powershell 复制代码
jar uf HelloJar-exec.jar HelloJar.class

即可,可执行 jar 依然可用,不需要重新指定 manifest。


4. 其它常用操作

  • 解压 jar 包:

    powershell 复制代码
    jar xf HelloJar-exec.jar
  • 查看 manifest 信息:

    powershell 复制代码
    jar xf HelloJar-exec.jar META-INF/MANIFEST.MF
    notepad META-INF\MANIFEST.MF

5. 总结

  • jar 命令用于打包、查看、解压、更新 jar 文件
  • 创建可执行 jar 包需指定 Main-Class,manifest 文件最后要有空行
  • 只更新 class 文件时用 jar uf,可执行属性会保留
  • jar 包结构标准包含 META-INF/MANIFEST.MF

通过本次学习,我掌握了 jar 命令的基本用法、可执行 jar 的制作方法,以及常见问题的排查和解决。希望对你也有帮助!

相关推荐
shark-chili18 小时前
从操作系统底层浅谈程序栈的高效性
java
不知疲倦的仄仄19 小时前
第二天:深入理解 Selector:单线程高效管理多个 Channel
java·nio
期待のcode19 小时前
Java虚拟机栈
java·开发语言·jvm
珂朵莉MM19 小时前
全球校园人工智能算法精英大赛-产业命题赛-算法巅峰赛 2025年度画像
java·人工智能·算法·机器人
芒克芒克19 小时前
本地部署SpringBoot项目
java·spring boot·spring
cute_ming19 小时前
关于基于nodeMap重构DOM的最佳实践
java·javascript·重构
sww_102619 小时前
Netty原理分析
java·网络
小突突突19 小时前
Spring框架中的单例bean是线程安全的吗?
java·后端·spring
Mr.Entropy20 小时前
JdbcTemplate 性能好,但 Hibernate 生产力高。 如何选择?
java·后端·hibernate
菜鸟233号20 小时前
力扣96 不同的二叉搜索树 java实现
java·数据结构·算法·leetcode