Java打包JAR详解:JarOutputStream使用教程
时间:2026-02-02 15:29:33 203浏览 收藏
在文章实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Java中使用JarOutputStream打包JAR详解》,聊聊,希望可以帮助到正在努力赚钱的你。
Java中用JarOutputStream打包JAR文件,本质是向ZIP流写入符合JAR规范的条目(JarEntry)并可选添加META-INF/MANIFEST.MF;必须显式设置JarEntry时间戳(如entry.setTime(System.currentTimeMillis())),否则部分JDK版本使用1980-01-01默认值导致解压失败;MANIFEST.MF必须作为第一个条目写入,即先putNextEntry(new JarEntry("META-INF/MANIFEST.MF"))再manifest.write(jarOut);资源路径须用正斜杠/且不以/开头,目录项以/结尾(如"com/example/");每个putNextEntry()后必须调用closeEntry(),整体推荐try-with-resources确保流正确关闭。

Java 中用 JarOutputStream 打包 JAR 文件,本质是往 ZIP 格式流中写入符合 JAR 规范的条目(JarEntry),并可选添加 META-INF/MANIFEST.MF。关键不在“压缩”,而在“正确构造条目结构和元信息”。
必须设置 JarEntry 的时间戳
JarOutputStream 对条目时间戳敏感:若未显式设置,部分 JDK 版本会用默认值(如 1980-01-01),导致解压工具报错或校验失败。安全做法是统一设为当前时间或固定可信时间。
- 调用
entry.setTime(System.currentTimeMillis()) - 或使用确定值避免构建差异:
entry.setTime(1717027200000L)(例如 2024-05-30)
Manifest 要在第一个 entry 写入前写入
JAR 规范要求 META-INF/MANIFEST.MF 必须是归档中第一个条目。否则某些运行环境(如 Java Web Start 或旧版 ClassLoader)可能忽略它。
- 先创建
new JarEntry("META-INF/MANIFEST.MF") - 调用
jarOut.putNextEntry(entry) - 再用
manifest.write(jarOut)写入内容 - 最后
jarOut.closeEntry()
普通资源文件需按路径规范构造 JarEntry
JAR 中路径分隔符必须为正斜杠 /,且不能以 / 开头;目录条目要以 / 结尾(如 "com/example/"),但通常可省略——JAR 工具会自动推导。
- 正确:
new JarEntry("com/example/MyClass.class") - 错误:
new JarEntry("\\com\\example\\MyClass.class")或new JarEntry("/com/example/MyClass.class") - 目录项非必需,但显式添加可提升兼容性(尤其含空包时)
别忘了 closeEntry() 和 finally 确保关闭
每个 putNextEntry() 后必须配对 closeEntry(),否则内容可能截断;流本身也要确保关闭,推荐 try-with-resources。
- 写完一个 entry 后立即
jarOut.closeEntry() - 整个流程用
try (JarOutputStream jos = new JarOutputStream(...)) { ... } - 避免手动调用
jos.flush()——closeEntry()和close()已隐含刷新
基本上就这些。JarOutputStream 不复杂,但细节容易忽略,尤其是时间戳和 MANIFEST 位置。按规范走,打出来的 JAR 就能被 JVM 正常加载和验证。
以上就是《Java打包JAR详解:JarOutputStream使用教程》的详细内容,更多关于的资料请关注golang学习网公众号!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
149 收藏
-
299 收藏
-
362 收藏
-
390 收藏
-
378 收藏
-
419 收藏
-
337 收藏
-
149 收藏
-
226 收藏
-
177 收藏
-
308 收藏
-
342 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习