Java的JAVA_HOME、Path、CLASSPATH环境变量小结,可以借助这三个的配置去理解Oracle中的那几个环境变量的配置作用

Java的JAVA_HOME、Path、CLASSPATH环境变量小结,可以借助这三个的配置去理解Oracle中的那几个环境变量的配置作用

问题:在哪里都能执行java命令,是和JAVA_HOME变量有关系呢还是path中指定的那个java路径呢??

刚学Java的时候,很多jdk配置教程都要求设置JAVA_HOME、Path、CLASSPATH3个变量。而Java官网有这么一句话:jdk1.5之后的版本在安装时不用设置CLASSPATH变量。今天我就以jdk1.5为例,总结下三者的区别。

Path
当我们安装完jdk之后,打开cmd(在非安装目录的路径下)输入javac、java,会提示找不到命令。我们需要将命令所在的路径添加到Path系统变量中,这时,系统就可以找到可执行文件了。

Windows在查找可执行文件是这样的:在终端输入java时,系统就会先在当前目录查找java程序,如果有就会执行java,否则就会在Path中指定的路径中找,因为我们在PATH配置了...\jdk\bin,系统会在这个路径下找到Java程序并执行。否则就提示找不到命令。Path的作用其实就是方便我们使用一些命令。

JAVA_HOME
JAVA_HOME里面的内容是JDK安装目录。其实不设置JAVA_HOME也是可以的,只要有Path就行了。但是设置JAVA_HOME可以方便在Path中使用、更新JDK目录。比如,jdk的安装路径是C:\jdk1.5.0_22,Path设置为C:\jdk1.5.0_22\bin,而当我们把JAVA_HOME设为C:\jdk1.5.0_22时,设置Path就可以写成%JAVA_HOME%\bin,以后当我们使用其他版本的jdk,就可以只修改JAVA_HOME的值,此外,当我们要使用Redis等组件时,也可以灵活使用JAVA_HOME做些改动。

CLASSPATH
编译、运行Java程序时,JRE会去该变量指定的路径中搜索所需的类(.class)文件,很多配置教程都让我们设置CLASSPATH环境变量为:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar,但是其实没有必要。以jdk1.5为例,当我们配置完成后,写个HelloWorld.java。

 在cmd中进入文件目录,可以发现依然可以编译、运行

 再查看运行的详细信息,可以看到没有CLASSPATH的情况下rt.jar、当前目录也是可以被JVM找到的。

 也就是说,在JDK 1.5之后,完全可以不配置这个变量。不配置CLASSPATH,JRE会自动搜索当前路径下的类文件。编译、运行时,系统可以自动加载dt.jar和tools.jar文件中的Java类。

  当然,使用JDK 1.5以上的版本也可以在属性配置CLASSPATH环境变量,一旦设置了该变量,JRE就会按照该变量指定的路径搜索Java类(如果CLASSPATH中不包括当前路径.,JRE就不会在当前路径下搜索Java类)。这种方法是一劳永逸的,当我们只是想临时运行某些类,我们就可以将它们临时加到CLASSPATH中(cmd已关闭,就没了)。如下面所示:

返回父目录,毫无疑问父目录没有HelloWorld.class文件,所以运行时找不到主类。这是因为JVM只会在当前目录、dt.jar、tools.jar中找class文件,而找不到当前目录的子目录中的class文件。

 解决方法是(1)将当前目录的子目录用set命令临时添加到CLASSPATH中(只在当前窗口生效),这时就可以运行了:

 (2)此外想在运行Java程序时临时指定JRE搜索Java类的路径,也可以使用-classpath(-cp)选项,如下面的格式。(dir是要指定的路径名)

java -classpath dir 类名

java -classpath dir 类名

对于第二种方法,有个注意的点:采用这种方法会先在classpath中查找class文件,即时当前目录有class也有可能找不到,如下所示:新建名为1的一个空文件夹,进入helloworld文件夹,尽管helloworld里面有class文件也没法识别到。

 也就是说,使用了-classpath选项后,JRE将严格按-classpath指定的路径来搜索Java类。如果想使CLASSPATH环境变量指定的路径还生效,可以按下面的格式来运行Java程序。

java -classpath %CLASSPATH%;.;dir 类名

小结:
1、 path环境变量是先在当前目录找执行程序,如果没有,再到path指定目录中去寻找。而classpath是先在classpath环境变量中去找执行程序,找到了,即使当前目录中有同样的执行程序也执行不到;且只要在classpath的值后面加了英文句号才会当前目录中来寻找执行程序。为了方便,以后尽量用set CLASSPATH,而不要使用-classpath的选项。

2、 在设置临时变量时,如果想保留原有的path值,只需在新设的值后面加上%path%这样的语句就行了。如:set path=新路径;%path%;

3、 在使用javac和java进行编译和执行程序时,如果出现找不到文件的情况,在环境变量设置正确的前提下,只有两种可能:一是目录错误;二是文件名错误。
————————————————
博主「JeremyChan1887」
原文链接:https://blog.csdn.net/sinat_30973431/article/details/82556821