问题
1、学过java的同学应该都知道,第一堂课就是如何安装jdk和配置jdk的环境变量,主要配置的环境变量有三个,分别是JAVA_HOME、path、CLASSPATH,如下是我本机的jdk环境变量配置信息:
JAVA_HOME F:\java\jdk
CLASS_PATH .;F:\java\jdk\lib
path F:\java\jdk\bin;...(path比较特殊,不止jdk,故其他的忽略)
2、配置完环境变量后,老师可能就会告诉你,打开cmd,然后敲入javac和java,是不是弹出来一大推提示信息,如果有,那说明你配置成功了
3、那么问题就来了,为什么要配置环境变量呢?配置环境变量到底做了什么事情?接下来我们开始分析!
大胆的假设
1、我们发现JAVA_HOME配置的是jdk的根目录,如下图,也就是说,我们现在告诉了操作系统,我装的jdk的根目录在这个路径,如果你需要什么资源,可以来这个路径下找
2、path中配置的是F:\java\jdk\bin目录,查看如下,我们可以看到里面存在大量的exe文件,可以猜测,jdk在执行某些java程序的时候,实际上是调用了这里面的命令来执行的。
3、CLASSPATH里面配置的是F:\java\jdk\lib,查看如下,发现里面存在一些jar文件以及其他文件,可以猜测这些是一些工具,当我们需要调用某些jdk自己写好的功能的时候,就是调用了这里面的东西。
小心的论证
我们使用记事本来编写java程序,进行论证:
1、首先,编写了一个HelloWorld.java,其中内容如下:
public class HelloWorld{
public static void main(String[] args){
System.out.println("hello world");
}
}
2、进入cmd命令,到达这个文件所在路径后,执行命令javac HelloWorld.java,发现执行命令成功,且生成了一个HelloWorld.class文件。
①为什么能执行javac命令?
我们先不问为什么会生成一个class文件出来,首先为什么能执行javac呢?那么我们首先要知道javac在哪,很明显,我们在F:\java\jdk\bin目录下找到了javac.exe文件,也就是说实际上是操作系统调用了这个文件,而我们只是在path上配置了bin目录,为什么操作系统就知道要从这个目录下去调用这个javac.exe文件呢?这就是操作系统的原理了,原来,当我们在操作系统的某个目录下执行某个命令xxx的时候,操作系统首先会在当前目录下查看有没有这个命令,如果没有,再去path环境变量中去找这个命令,找到了就调用,没找到就提示错误!
如何验证?既然我们猜测得出执行javac HelloWorld.java的时候,调用的是javac.exe命令来执行的,那么我如果将环境变量中的path去掉,然后用javac.exe的绝对路径来执行,也应该是成功得到class文件,操作结果如下:果然如此!既然javac是这个原理,那么像java、javaw等各种命令,自然也是这个原因了,不再解释
②为什么需要配置JAVA_HOME?
很多资料上都说,配置JAVA_HOME是最重要的,这是真的吗?为了验证,我首先在自己的电脑上将这个环境变量进行了删除,然后再去编译执行HelloWorld.java,发现执行却是成功的?这是为什么呢?找了很久,最终发现,原来,配置JAVA_HOME主要是为了其他软件的方便,因为有些软件运行需要有jdk的支持,所以说,如果你是大神,写java代码只需要记事本,其实你不配置JAVA_HOME也是可以正常运行代码的,不过为了兼容第三方,还是建议配置这个变量。
③为什么要配置CLASSPATH:
首先我们来改造一下HelloWorld.java,修改后如下:在其中我们导入了ArrayList,而这个是jdk为我们提供的一个类
import java.util.ArrayList;
public class HelloWorld
{
public static void main(String[] args)
{
ArrayList<String> test = new ArrayList<>();
test.add("hello");
System.out.println("HelloWorld");
}
}
此时我们使用javac和java来编译执行,发现结果如下,显然成功编译运行
那么我们接下来,我们将配置好的CLASSPATH进行删除,然后重新编译和执行,发现结果如下:发现还是编译成功了。这就有点奇怪了,接下来我想是不是因为配置了JAVA_HOME的原因呢?操作系统会不会先去找CLASSPATH,找不到然后就去找JAVA_HOME,没想到果然如此,再删掉JAVA_HOME和CLASSPATH后,然后再编译HelloWorld.java文件,发现还是能够正常运行。结论就是:CLASSPATH似乎并没有什么卵用。
结论
我们在安装完jdk后,如果只是要写java代码!完全可以不必要配置jdk的环境变量,因为我们只需要知道具体编译javac和java两个命令的具体地址,我们肯定是能够去编译和运行代码的,但是为了方便,还是配上环境变量吧,毕竟更方便!