felix-cao / Blog

A little progress a day makes you a big success!
31 stars 4 forks source link

Java 之 JRE、JDK、JVM 及环境变量 #151

Open felix-cao opened 5 years ago

felix-cao commented 5 years ago

如何搭建 Java 开发环境 可以参考 《Java 开发环境的配置》,本文主要 聊一聊 JREJDKJVM 三者之间的区别与联系及环境变量。

一、概念

这样看来,它们三者是有关系的,这是一种冗余的包含关系:JDK > JRE > JVM

下图是官方1.8的文档说明

运行时使用 jre 而不使用 jdk,一方面是为了减少硬盘空间的使用,另一方面也有一定的安全考虑,防止 jdk 里的一些执行命令被恶意篡改。当然,现在大部分公司运行时已经不那么区分 jdkjre 了,直接在服务器上跑 JDK

二、系统环境变量

环境变量, Environment Variable。

首先,你把操作系统当做是一个最大的软件,其它软件如 OfficeJVMLOL 等等都是运行在这个软件之内的小软件。那么,相对于这些小软件来说,它们所处的 环境 就是操作系统这个软件。

环境变量 就是操作系统这个软件中的变量,即:操作系统提供给你的全局变量!

2.1、window 的系统环境变量 Path

安装 JDK 以后,因为需要配置 window 的系统环境变量 Path,所以我们需要来简单聊一聊这个话题。

window 系统下,当执行用户命令时,若用户未给出绝对路径,系统搜索命令的路径的顺序是这样的:

所以 PATH 是操作系统用的,用来指定操作系统需要使用到的可执行程序的位置。对于 Java 来说,通常需要把 JDKbin 目录添加进入 PATH 中,这样你就可以在任意目录下使用 bin 下面的可执行程序,如 javac.exejava.exe等。

JAVA_HOME 是一个约定,通常它指的是 JDK 的目录。如果需要 JDK 的话,大部分程序会默认去环境变量中取 JAVA_HOME 这个变量。

CLASSPATHjavac 编译器的一个环境变量。它的作用与 importpackage 关键字有关。当你写下 improt java.util.* 时,编译器面对 import 关键字时,就知道你要引入 java.util 这个 package 中的类;但是编译器如何知道你把这个 package 放在哪里了呢?所以你首先得告诉编译器这个 package 的所在位置;如何告诉它呢?就是设置 CLASSPATH 啦,

CLASSPATH 环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM 就是通过 CLASSPATH 来寻找类的。我们需要把jdk安装目录下的lib子目录中的dt.jartools.jar设置到CLASSPATH中,当然,当前目录.也必须加入到该变量中。这里CLASSPATH为:

.;C:/Program Files/Java/jdk1.6.0_21/lib/dt.jar;C:/Program Files/Java/jdk1.6.0_21/lib/tools.jar

三、为什么我们的电脑在装完 jdk 后会有 jre 文件夹

window 下,我们的 jdk 安装成功后,在 C:\Program Files\Java 目录下会是同时存在 jdkjre 两个目录, 而在 jdk 目录下又存在一个子目录 jre,如下图示:

不过最新的 JDK11 这个版本已经无需再安装 JRE,设置环境变量时也不用设置 CLASSPATH

Reference