# 为什么要配环境变量

# 1. 环境变量

环境变量顾名思义,就是指在系统(Window / Linux)环境中存在着的变量。

逻辑上,『环境变量』类似于编程领域中的全局变量的概念,只不过,这个『全局』是一个更大的全局,是操作系统层面的全局。

理论上,(不考虑访问权限问题),任何一个程序/进程,如果有需要,都能看得到、访问到这些“全局变量”。

系统中有一些自带的、默认存在的环境变量,通常情况下『不要改变这些系统自带的环境变量的值』,特别是不要删除(不要删除、不要删除)它们的原值。

如果有需要,你也可以为你的系统添加新的环境变量

# 2. PATH 环境变量

PATH 是操作系统中的环境变量之一,它是系统自带的环境变量。

在使用操作系统过程中,你会在控制台/终端输入命令。每一个命令的背后都有一个与之对应的可执行程序,在 Windows 上就是 .exe.bat 这样的可执行程序。

上面这句话中的『每个』和『都有』,不是 100% 正确,但是绝大多数情况下都是如此。这就是『内部命令』和『外部命令』的区别,这里不扩展讲解。

那么,一个很显而易见的问题来了:操作系统如何知道这些命令『背后』的执行程序在哪?它怎么知道去哪里找这些可执行程序?

操作系统靠 PATH 环境变量。PATH 环境变量的值,是多个目录的路径。在 Win 10 中,这些路径每一个都是独行展示;在 Win 7 中这些路径名是以 ; 作为分隔符来连在一起,写作一行。

当『你』输入了一个命令,要求操作系统去执行某项操作时,操作系统会去 PATH 的这些目录下挨个查找是否有与命令同名的可执行程序。有,则执行;没有,则会报错。

# 3. Java 环境变量

当你要进行 Java 编程,或者是运行 Java 程序时,你会直接或间接使用到 javacjava 命令。

当你安装了 JDK 之后(假定你没有自定义安装路径,使用的是默认路径),你所安装的 JDK 的路径 C:\Program Files\Java\jdk1.8.0_201 下的 bin 目录下会存在 javac.exejava.exe 这样一批可执行程序。

但是问题是:当你输入 javacjava 命令时,Windows 不知道到这个 bin 目录下找 .exe 可执行程序!

因此,在安装完 JDK 之后,你需要将这个装有 javacjava(还有其他的命令的对应的执行程序)bin 目录『告诉』给 Windows 。以便于,让它知道要到这个目录下找可执行文件。

因此,我们需要将 C:\Program Files\Java\jdk1.8.0_201\bin 目录添加(添加、添加,不要删除 PATH 的原值)到环境变量 PATH 中。

# 4. JAVA_HOME 环境变量

有一些依赖于 Java 开发/运行环境的软件(例如 Tomcat)在运行时有一个前提条件:它会要求系统的环境变量中存在一个名为 JAVA_HOME 的环境变量,先估且不谈这个环境变量的值是什么,如果这个环境变量如果不存在,那么这些软件就会直接运行失败

这个『前提条件』是这些依赖于 Java 开发/运行环境的软件自身硬编码定死的,『你』作为这些软件的使用者无法更改这一点,只能遵守它,满足这个前提条件。

因此,为了能正常使用这些依赖于 Java 开发/运行环境的软件,我们必须确保操作系统的环境变量中存在一个名为 JAVA_HOME 的环境变量。如果没有,必须添加它

JAVA_HOME 这个环境变量的值,应该是你的 JDK 的安装路径。例如:C:\Program Files\Java\jdk1.8.0_201 。注意,这不是上面说的那个 bin 目录,而是 bin 目录的上一级目录。

本质上,就是因为这些软件在运行中要使用这个目录下的东西。所以,它们要求你通过一个名为 JAVA_HOME 环境变量来告知它们这个目录在哪。

# 5. JAVA_HOME 的一个副作用

本来,JAVA_HOME 环境变量和 PATH 环境变量是没有直接关系的。

但是,“碰巧”的是我们添加到 PATH 中的指明 .exe 文件所在地的 C:\Program Files\Java\jdk1.8.0_201\bin 中的前一段不正好就是 JAVA_HOME 吗?!

因此,我们可以在 PATH 中利用 JAVA_HOME。反正,你用或者不用,JAVA_HOME 都是存在着的。

因此,我们在 PATH 中添加的内容,就可以『简化』成:%JAVA_HOME%/bin

# 6. 一个小技巧

Windows 操作系统有一个 where 命令,Linux 操作系统有一个 which 命令,它们都能告诉你:你要执行的命令『背后』的可执行程序在哪里。

以 Windows 为例:

where javac

如果 where 命令有正常的输出结果,那么就意味着操作系统能找得到命令『背后』的那个可执行程序,那么该命令自然可以正常使用。