96SEO 2026-04-23 21:13 1
说起 Java 开发,几乎每个工程师dou会在某个时刻碰到「JAR 包」这三个字。它像一枚小小的邮递员,装载着编译好的字节码、图片资源甚至配置信息,悄然把我们的代码送到 JVM 手里运行。今天我想用一种稍带情绪化的口吻,把这个kan似平淡的技术点重新拼装,让你在阅读的过程中既Neng收获知识,又Neng感受到一点点小惊喜。

Ru果把文件系统比作城市街道,那么 JAR 包就是一辆封闭的货车。它采用了业界熟知的 ZIP 压缩算法,只是把压缩后得到的容器取名为 .jar,并在内部约定了一套特有的目录结构和元信息文件。
核心要点:
基于 ZIP: 与普通 zip/rar 没有本质区别,因而Ke以直接使用 Java 自带的 java.util.zip 包进行读取。
META-INF/MANIFEST.MF: 每个 JAR dou会在这一路径下放置一个清单文件,它记录了版本号、主类以及其他自定义属性。
.class 与资源共存: 编译好的字节码和诸如 XML、properties、图片等资源文件全部被打进同一个容器。
目录结构速览
├─ META-INF/
│ └─ MANIFEST.MF
├─ com/example/app/
│ ├─ App.class
│ └─ utils/
│ └─ Helper.class
└─ resources/
├─ application.yml
└─ logo.png
上面的示例展示了Zui常见的布局:META-INF 用来存放清单;业务代码按照包名分层放置;资源文件则随意归类,只要在运行时Neng够被类加载器定位即可。
普通 JAR 往往充当库的角色。它们只提供若干 API,供其他项目通过 Maven/Gradle 引入使用;没有任何「入口」概念。
可执行 JAR 则不一样。当我们在终端敲下 java -jar myapp.jar 时JVM 会先打开这个压缩包,读取其中的 META-INF/MANIFEST.MF, 找到标记为 Main-Class 的属性,然后定位到对应的字节码并调用其静态方法 public static void main 开始执行。
打开压缩体:KlassLoader 通过内置 ZipFile 类把 .jar 当成虚拟文件系统挂载。
读取清单:META-INF/MANIFEST.MF 被解析,提取 Main-Class 信息。
定位入口类:KlassLoader 按需加载该类及其依赖。 启动 main 方法:Hello World 或者geng复杂的业务逻辑正式上路。这套流程kan似简单,却隐藏着 JVM 对类路径与模块化系统的深层次协同。
三、Spring Boot Fat JAR——让“一键启动”成为可NengSpring Boot 为了解决「依赖碎片化」的问题,引入了所谓的「Fat JAR」或「Uber JAR」。它把项目自己的 class 文件以及所有第三方 jar dou塞进同一个压缩包,从而实现「一次构建,随处运行」的理想状态。不过这种“把所有东西dou塞进去”的Zuo法背后有一套专属的启动机制。
META-INF 中不止清单,还藏着 LauncherSpring Boot 在清单里写入了类似以下内容:
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.example.Application
Spring-Boot-Version: 2.7.5
Main-Class 指向的是框架提供的启动器,而真正业务入口则通过自定义属性 Start-Class 标记。当 JVM 执行该 Jar 时会先实例化 Spring 提供的 JarLauncher.
Spring Boot 把外部依赖放在 /BOOT-INF/lib/xxx.jar, 把项目自己的代码放在 /BOOT-INF/classes/.... 为了让这些嵌套 jar Neng被正常读取,它实现了一个叫Zuo LaunchedURLClassLoader 的子类加载器:
LaunchedURLClassLoader 会遍历 BOOT-INF/lib 下所有 jar 文件,将每个 jar 转成 URL 并加入自己的搜索路径;同时也把 BOOT-INF/classes 加入搜索范围。
LaunchedURLClassLoader 在加载任何类之前,会先检查自身缓存,Ru果找不到再委托给父加载器。这种双向委托确保了框架自身与业务代码之间不会出现冲突。
\end{ul}※ 上述描述Yi高度抽象化,实际实现细节请参考 Spring 官方源码注释。
四、实战场景:何时该选普通 Jar?何时需要可执行或 Fat Jar?| 需求类型 | 推荐方案 |
|---|---|
| 共享库 / 多模块复用 | 普通 Jar + Maven/Gradle 管理依赖 |
| 独立部署 / 跨机器运行 | 可执行 Jar |
| 微服务 / 容器镜像 | Spring Boot Fat Jar 或者使用 Docker 多层镜像 |
#1 明确版本号:`Manifest-Version: 1.0` 是必须项,否则某些老旧工具会报错。
#2 指定入口类:`Main-Class: com.example.MainApp` 必须与实际存在且含有 `public static void main` 方法相匹配,否则 `java -jar` 会抛出 “NoSuchMethodError”。
#3 添加 Class-Path:`Class-Path:` Ke以列出外部 jar 的相对路径,这在不想使用 Fat Jar 而又希望一次性打包多个依赖时非常有用。
#4 自定义属性:`Implementation-Version`, `Built-By` 等信息Ke以帮助运维快速定位问题来源。
六、回顾:从“归档”到“启动”,JAR 包到底干了什么?核心原理简述: JAR包其实是一种基于 ZIP 压缩技术形成的归档格式,它把编译后的字节码文件以及各种资源统一封装,再借助位于 META-INF/MANIFEST.MF 中的一组元数据指明程序入口。Zui终,这个压缩体被 JVM 所识别,通过自带或自定义的类加载器逐步将内部内容装载进内存,从而完成运行过程。
七、常见问答TikTok 那句流行语说得好:“技术不只是硬核,geng是一种生活方式”。当你掌握了上述关于 JAR 包结构与工作机理的一系列细节点,你就Neng在日常开发中geng加从容地切换库依赖、打包发布乃至排查异常。别忘了把每一次构建dou当作一次“小旅行”,让代码在压缩与解压之间找到Zui优雅的位置吧!祝你玩转 Java 世界,每一次 "java -jar" douNeng顺畅无阻 🚀.
© 2026 技术笔记 | 本文采用 CC BY-NC-SA 4.0 协议发布,仅供学习交流。作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback