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 的制作方法,以及常见问题的排查和解决。希望对你也有帮助!

相关推荐
大模型玩家七七2 小时前
基于语义切分 vs 基于结构切分的实际差异
java·开发语言·数据库·安全·batch
寻星探路7 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧9 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法10 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty72510 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎10 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄10 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿11 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds11 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化