## JDK 与 JRE 之间的区别是什么？

“二哥，之前的文章里提到 JDK 与 JRE，说实在的，这两个概念把我搞得晕乎乎的，你能再给我普及一下吗？”三妹咪了一口麦香可可奶茶后对我说。

“三妹，不要担心，二哥这篇文章一定会让你把它们搞得一清二楚。确实有不少初学的小伙伴对这两个概念很困惑，我当年也困惑了很久。”说完最后这句话，我脸上忍不住泛起了一阵羞涩的红晕。

### 01、JDK

JDK 是 Java Development Kit 的首字母缩写，是提供给 Java 程序员的开发工具包，换句话说，没有 JDK，Java 程序员就无法使用 Java 语言编写 Java 程序。也就是说，JDK 是用于开发 Java 程序的最小环境。

想要成为一名 Java 程序员，首先就需要在电脑上安装 JDK。当然了，新版的 Intellij IDEA（公认最好用的集成开发环境）已经支持直接下载 JDK 了。

![](https://cdn.jsdelivr.net/gh/itwanger/jmx-java/images/overview/six-01.png)

并且支持下载不同版本的 JDK，除了 Oracle 的 OpenJDK，还有社区维护版 AdoptOpenJDK，里面包含了目前使用范围最广的 HotSpot 虚拟机。

![](https://cdn.jsdelivr.net/gh/itwanger/jmx-java/images/overview/six-02.png)

如果下载比较慢的话，可以直接在 AdoptOpenJDK 官网上下载。

![](https://cdn.jsdelivr.net/gh/itwanger/jmx-java/images/overview/six-03.png)

如果还是比较慢的话，通过 Oracle 官网下载吧！

>https://www.oracle.com/java/technologies/javase-jdk11-downloads.html


JDK 安装成功后，就可以编写 Java 代码了，小伙伴们可以参照上一篇文章《[Hello World](https://mp.weixin.qq.com/s/GYDFndO0Q1Nqzcc_Te61gw)》。

JDK 包含了 JRE，同时还包含了编译 Java 源码的编译器 javac，以及其他的一些重要工具：

- keytool：用于操作 keystore 密钥；
- javap：class 类文件的最基础的反编译器；
- jstack：用于打印 Java 线程栈踪迹的工具；
- jconsole：用于监视 Java 程序的工具；
- jhat：用于 Java 堆分析的工具
- jar：用于打包 Java 程序的工具；
- javadoc：用于生成 Java 文档的工具；

### 02、JRE

JRE 是 Java Runtime Environment 的首字母缩写，是提供给 Java 程序运行的最小环境，换句话说，没有 JRE，Java 程序就无法运行。

Java 程序运行的正式环境一般会选择 Linux 服务器，因为更安全、更高效、更稳定。我们只需要在 Linux 服务器上安装 JRE 就可以运行 Java 程序，而不必安装 JDK，因为我们不需要在服务器上编译和调试 Java 源代码。

刚好我有一台闲置的阿里云服务器，这里就给小伙伴们演示一下 JRE 的安装过程。

第一步：使用以下命令列出服务器上可以安装的 Java 环境：

>yum list java*

可以看到有这么一些（只列出 Java 11 的部分——最近一个 LTS 版本）：

![](https://cdn.jsdelivr.net/gh/itwanger/jmx-java/images/overview/six-04.png)

其中 JRE 为 java-11-openjdk.x86_64，JDK 为 java-11-openjdk-devel.x86_64。

第二步，使用以下命令安装 JRE：

>yum install java-11-openjdk.x86_64

第三步，使用以下命令测试是否安装成功：

>java -version

如果出现以下结果，则表明安装成功：

![](https://cdn.jsdelivr.net/gh/itwanger/jmx-java/images/overview/six-05.png)

由于 JRE 中不包含 javac，所以 `javac -version` 的结果如下所示：

![](https://cdn.jsdelivr.net/gh/itwanger/jmx-java/images/overview/six-06.png)

那既然服务器上的 JRE 环境已经 OK 了，那我们就把之前的“Hello World”程序打成 jar 上传过去，让它跑起来。

第一步，Maven clean（对项目清理）：

![](https://cdn.jsdelivr.net/gh/itwanger/jmx-java/images/overview/six-07.png)

第二步，Maven package（对项目打包）：

![](https://cdn.jsdelivr.net/gh/itwanger/jmx-java/images/overview/six-08.png)

可以在 Run 面板中看到以下信息：

![](https://cdn.jsdelivr.net/gh/itwanger/jmx-java/images/overview/six-09.png)

说明项目打包成功了。

第三步，使用 FileZilla 工具将 jar 包上传到服务器指定目录。

![](https://cdn.jsdelivr.net/gh/itwanger/jmx-java/images/overview/six-10.png)

第四步，使用 iTerm2 工具连接服务器。

![](https://cdn.jsdelivr.net/gh/itwanger/jmx-java/images/overview/six-11.png)

第五步，执行以下命令：

>java -cp TechSister-1.0-SNAPSHOT.jar com.itwanger.five.HelloWorld

可以看到以下结果：

![](https://cdn.jsdelivr.net/gh/itwanger/jmx-java/images/overview/six-12.png)

“搞定了，三妹，今天我们就学到这吧。”转动了一下僵硬的脖子后，我对三妹说，“开发环境需要安装 JDK，因为既需要编写源代码，还需要打包和测试；生产环境只需要安装 JRE，因为只需要运行编译打包好的 jar 包即可。”

“好的，二哥，能把你的服务器账号密码给我一下吗，我想上去测试一把。”三妹似乎对未来充满了希望，这正是我想看到的。

“没问题，随便倒腾。”