Java 的 jar -u 命令无法更新 MANIFEST.MF,因其设计仅支持添加/更新普通文件,而 MANIFEST.MF 作为核心元数据必须在创建(-c)或重建(-cfm)时指定;正确方式是用 -cfm 重建 JAR 或解压→替换→重打包。

Java 中没有 jar -uvfm 这个命令,jar 工具不支持直接“更新” MANIFEST.MF 文件而不重新打包整个 JAR。所谓 -u(update)模式在实际使用中**无法修改或替换已存在的 MANIFEST.MF**,它只会将新文件追加进 JAR,而对已有清单文件无效——MANIFEST.MF 必须位于 META-INF/ 根目录且只能在创建(-c)或重置(-cfm)时指定。
为什么 jar -u 不能更新 MANIFEST.MF
jar -u 的设计初衷是向已有 JAR 中添加或更新普通类/资源文件,但 META-INF/MANIFEST.MF 是 JAR 的元数据核心,JVM 和类加载器依赖其完整性与位置。jar 工具明确禁止在 update 模式下覆盖该文件,即使你用 -m 指定新清单,也会被忽略或报错(如 java.io.IOException: invalid header field)。
正确更新 MANIFEST.MF 的两种可靠方式
要真正更新清单内容(如添加 Class-Path、Main-Class、自定义属性),必须重建 JAR 或显式替换清单:
-
方式一:用 -cfm 重建整个 JAR(推荐)
先准备好新 MANIFEST.MF(例如含Main-Class: com.example.Main),再执行:jar cfm new.jar manifest.mf -C original/ .
其中original/是解压后的源目录;.表示打包当前目录下所有内容。 -
方式二:解压 → 替换 MANIFEST.MF → 重新打包
① 解压:jar -xf app.jar
② 替换META-INF/MANIFEST.MF(注意保留 LF 换行、末尾空行)
③ 重新打包:jar -cf app.jar *(确保在项目根目录执行,且不含隐藏文件干扰)
注意事项与常见陷阱
手动操作时容易出错,需特别注意:
- MANIFEST.MF 每行最多 72 字节,超长需用空格续行(第二行开头必须是空格)
- 文件末尾必须有一个空行,否则 jar 工具可能解析失败
- 属性名区分大小写(如
Main-Class不可写成main-class) - 若原 JAR 含签名(
META-INF/*.SF),更新 MANIFEST.MF 后签名失效,需重新签名(jarsigner)
自动化建议:用 Maven 或 Gradle 管理清单
日常开发中,硬编码 jar 命令易出错。更稳妥的做法是交由构建工具管理:
- Maven:在
pom.xml的maven-jar-plugin中配置,声明Main-Class或manifestEntries - Gradle:在
jar { manifest { attributes(...) } }中设置,每次./gradlew jar自动生成合规清单
这样既避免手误,也天然兼容签名、依赖路径等复杂场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











