从 JDK 到 SDK:Java 实习生眼中的“工具包”与“交付物”
本文从Java实习生的视角探讨了JDK、JRE、SDK和JAR包的核心概念及其工程意义。JDK包含完整的开发工具,而JRE仅保留运行环境,线上使用JRE可缩小体积并提升安全性。JAR包作为Java交付物,普通JAR用于依赖,可执行JAR(如Spring Boot的Fat Jar)通过指定Main-Class实现独立运行。第三方SDK(如阿里云OSS)通过封装复杂逻辑(如签名、HTTP请求)显著提升

文章目录
从 JDK 到 SDK:Java 实习生眼中的“工具包”与“交付物”
关键词
JDK、JRE、SDK、JAR包、可执行JAR、Fat Jar、MANIFEST.MF、Main-Class、阿里云OSS SDK、编译、运行环境
关键问题
- 开发环境用JDK、线上用JRE的核心原因:JDK含编译/调试工具,JRE仅保留运行核心,可缩小镜像体积、降低攻击面?
- 普通JAR(无Main-Class,仅作依赖)与可执行JAR(含Main-Class)的核心差异,Spring Boot Fat Jar如何内嵌依赖独立运行?
- 阿里云OSS SDK本质是封装了签名、HTTP请求的JAR包,相比手写HTTP请求,SDK如何简化文件上传等操作?
- JDK为何是Java语言的SDK,第三方SDK(如OSS)的核心价值是封装底层细节、提升开发效率?
引言
刚接触 Java 那会儿,我总把 JDK 和 JRE 混着用。装环境时不知道选哪个,打包时搞不清 JAR 为什么有的能运行有的不能。直到实习时被 leader 问:“你知道为什么我们线上容器里只装 JRE 吗?”我才意识到这些基础概念背后,藏着工程化的深刻思考。
后来工作中又接触了各种 SDK(阿里云 OSS SDK、微信支付 SDK),发现它们本质上都是一堆 JAR 包,却让开发效率成倍提升。今天,我想从一个实习生的视角,把这些“工具包”们理清楚。
第一部分:JDK vs JRE——开发与运行的边界
1.1 官方的定义
- JRE (Java Runtime Environment):Java 运行时环境。包含 Java 虚拟机(JVM)和 Java 核心类库,是运行 Java 程序所需的最小环境。
- JDK (Java Development Kit):Java 开发工具包。包含 JRE 的全部内容,再加上编译器(javac)、打包工具(jar)、文档生成器(javadoc)、调试器(jdb)等开发工具。
1.2 面试场景:为什么本地装 JDK,线上用 JRE?
这个问题我当初答不上来,后来明白了:
- 本地开发需要编译、打包、调试,所以必须装 JDK。你在 IDE 里写代码,点击运行,背后是 javac 在编译,是 jar 命令在打包。
- 线上服务器只需要运行你的程序,不需要编译。所以装一个瘦身的 JRE 就够了。好处显而易见:
- 体积小:JDK 约 300MB,JRE 约 150MB(具体看版本)。Docker 镜像能缩小一半。
- 安全:线上环境不需要编译器、调试工具,减少攻击面。
注意:Java 9 之后,JRE 不再是独立发行版,JDK 内置了 jlink 工具可以定制化精简运行时,这又是另一个话题了。
1.3 广义的 SDK
SDK(Software Development Kit)是一个广义词,泛指“软件开发工具包”。JDK 其实就是 Java 语言的 SDK。同理,Android SDK、阿里云 SDK 都是为特定平台或服务提供的开发包。
第二部分:JAR 包——Java 世界的交付物
2.1 JAR 包的本质
JAR 文件全称 Java Archive,本质上是一个 ZIP 压缩文件,里面包含:
- 编译后的
.class文件 - 资源文件(配置文件、图片等)
- 元信息文件夹
META-INF,里面最重要的就是MANIFEST.MF清单文件。
你可以用任何解压软件打开一个 JAR 包,看到里面清晰的目录结构。
2.2 普通 JAR vs 可执行 JAR
| 类型 | 特点 | 示例 |
|---|---|---|
| 普通 JAR | 清单文件中没有 Main-Class 属性,不能独立运行,只能作为其他项目的依赖。 |
commons-lang3.jar、mysql-connector-java.jar |
| 可执行 JAR | 清单文件指定了 Main-Class,告诉 JVM 从哪个类的 main 方法启动。 |
Spring Boot 打包的 JAR |
Spring Boot 的可执行 JAR 更特殊:它把项目依赖的所有第三方 JAR 都塞进自己的 JAR 里(即 Fat Jar),并在清单文件中用 Start-Class 指向真正的业务主类,通过自定义类加载器加载内嵌的依赖。所以一个 Spring Boot 的 JAR 就能直接 java -jar 运行,无需部署到外部容器。
第三部分:SDK 的实际应用——以阿里云 OSS 为例
3.1 引入 SDK 就是引入一个 JAR
在 Maven 项目中,我们这样引入阿里云 OSS SDK:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
本质上,就是下载了一个 JAR 包到本地仓库,它包含了封装好的 OSS 客户端类、请求模型、签名逻辑等。
3.2 SDK 带来的封装
假设我们需要上传一个文件到 OSS。如果不使用 SDK,你需要:
- 构造请求 URL
- 计算签名(涉及 HMAC-SHA1 算法)
- 发送 HTTP 请求(设置 Header、Body)
- 解析响应 XML
用 HttpClient 手写大概几十行代码,而且容易出错。而用 SDK,只需要:
// 创建 OSS 客户端
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件
ossClient.putObject(bucketName, objectName, new File("test.txt"));
// 关闭客户端
ossClient.shutdown();
对比:SDK 把复杂的签名、HTTP 通讯、错误处理都封装了,对外提供类型安全的 API,参数明确,文档清晰。这正是 SDK 的价值——让我们专注于业务逻辑,而不是重复造轮子。
总结:从 JDK 到 SDK,都是工具包
回顾一下:
- JDK 是 Java 语言的 SDK,提供编译、运行、调试的工具。
- JRE 是 JDK 的子集,专为运行环境优化。
- JAR 是 Java 模块的交付格式,普通 JAR 是依赖,可执行 JAR 是独立应用。
- 第三方 SDK 也是 JAR 包,封装了特定服务的复杂细节,让我们能一行代码调用云服务。
理解这些概念,不仅能帮你应对面试,更能培养工程化的思维:好的工具包,应当让使用者专注于业务,而非底层实现。下一次当你引入一个 SDK 时,不妨想想它背后替你省去了多少工作。
更多推荐



所有评论(0)