1.8 扫清Java征途中的两块绊脚石

img

扫码看视频

1.8.1 有用的PATH

在上一节,我们在编译Java源程序时,需要把javac.exe程序的完整路径输入到命令提示符窗口中,这种方式太麻烦了,有没有简便一些的方法呢?

当然有,你可以在程序所在的文件夹(即D:\Java\jdk-11.0.7\bin)下执行javac.exe,不过你的Java源程序就需要输入完整路径了,但是这样做貌似同样麻烦。

在Windows操作系统中,我们可以通过环境变量PATH来指定可执行程序所在的路径,在执行程序时只需要输入程序的名称,操作系统就会自动按照PATH所设定的目录去查找对应的程序。如果在PATH环境变量设置的所有路径中都没有找到该可执行程序,就会提示如图1-10所示的错误。

下面,我们先在命令提示符窗口中输入如下的命令设置PATH路径。

img

或者

img

注意:等号两边不要有空格。

然后执行javac Hello.java,可以看到此时找到了javac.exe,也成功编译了Hello.java,如图1-18所示。

img

图1-18 设置PATH路径后编译Hello.java

不过,这种方式不是一劳永逸的,当我们再打开一个命令提示符窗口,输入“javac”时,系统还是会提示找不到该程序,这是因为我们在当前命令提示符窗口中设置的环境变量只对当前窗口生效。那么如何让系统永远地记住这个路径呢?

其实也很简单,我们只需要配置系统的环境变量PATH,将Java可执行程序的路径包含进去就好了。在文件资源管理器中,用鼠标右键单击【这台电脑】,在弹出的菜单中选择【属性】→【高级系统设置】,在【高级】选项卡中单击【环境变量】,如图1-19所示。

img

图1-19 设置环境变量

在“系统变量(S)”下找到“Path”变量,单击“编辑(I)…”按钮,在弹出的“编辑系统变量”对话框中的“变量值(V)”文本框中输入“D:\Java\jdk-11.0.7\bin;”,注意末尾的分号,PATH环境变量的值中的各个路径都是以英文的分号(;)作为分隔的,如图1-20所示。之后一直单击“确定”按钮,完成PATH环境变量的设置。

img

图1-20 编辑PATH变量

重新打开命令提示符窗口,输入javac,你会发现系统找到了该可执行程序,如图1-21所示。

img

图1-21 在设置PATH环境变量之后

提示:(1)Windows环境变量名是不区分大小写的。

(2)在用户变量下也可以设置PATH环境变量,只不过该变量的值只针对当前登录系统的用户才有效。

(3)之所以要把我们安装的JDK的bin目录设置在PATH环境变量的开始位置处,是为了防止电脑中其他与Java相关的软件也在PATH变量下设置了路径,从而导致在编译和执行我们的Java 程序时,系统自动选择了该软件自带的Java编译器和解释器,由于版本的不同,使得程序得不到正确的结果,毕竟系统是以路径的先后顺序来查找可执行程序的。

1.8.2 难缠的CLASSPATH

在使用java.exe执行Hello类时,是在Hello程序所在的文件夹下运行的。如果我们换一个目录,如E盘的根目录,那么再输入java Hello看看会发生什么情况,如图1-22所示。

img

图1-22 在E盘根目录运行Hello程序

这时出现了一个错误,提示“找不到或无法加载主类Hello”。由于Hello.class文件在F:\JavaLesson\ch01目录下,而在E盘的根目录下不存在Hello.class这个文件,因此Java解释器自然就找不到Hello这个类了。

那么,我们试一下执行java F:\JavaLesson\ch01\Hello,结果如图1-23所示。

img

图1-23 执行java F:\JavaLesson\ch01\Hello报错

显然采用这种方式来执行Java类也是行不通的,这是因为java.exe接收的参数是Java类名,你将类名连同路径一起传递给java.exe,它就认为这个完整路径是一个类名,找这么一个复杂名字的类自然是找不到的。

在Java中,有一个环境变量叫CLASSPATH,该变量可以用于设置Java类所在的路径,在命令提示符窗口中先输入下面的命令设置Hello类所在的路径。

img

注意:等号两边不要有空格。

然后再次执行java Hello,结果如图1-24所示。

img

图1-24 设置CLASSPATH变量后执行Hello类

可以看到这个时候java.exe找到了Hello类。要注意,CLASSPATH环境变量,表示的是类路径,该变量是在执行java.exe命令时用来查找Java类的,不要和Windows操作系统的环境变量PATH搞混淆了。

接下来我们回到Hello.class所在的文件夹下,再次设置CLASSPATH环境变量的值为E:,执行java Hello,结果如图1-25所示。

img

图1-25 在Hello.class所在文件夹下执行Hello类提示找不到

在F:\JavaVideo\ch01目录下明明有Hello.class,为什么找不到Hello类呢?这是因为一旦你设置了CLASSPATH环境变量,Java解释器就会严格按照该变量设置的路径(现在CLASSPATH配置的类路径是E盘)查找Java类,即使你是在Java类所在的文件夹下执行的,它也“看不到”这个类。如果没有设置CLASSPATH环境变量,那么在Java类所在目录下执行该类是可以找到的,不过,为了防止其他软件也配置了CLASSPATH而导致找不到我们编写的类,我们还是应该手动配置一下CLASSPATH。由于我们通常都是在当前目录下编译执行Java程序,所以在设置CLASSPATH变量时,可以用一个点号(.)作为它的值,代表当前目录。

当然,也可以在操作系统的系统变量下一劳永逸地设置CLASSPATH环境变量,方法和设置PATH变量相同。

在文件资源管理器中,用鼠标右键单击【这台电脑】,在弹出的菜单中选择【属性】→【高级系统设置】,在【高级】选项卡中单击【环境变量】,然后在“系统变量(S)”下单击“新建(W)…”按钮,变量名为:CLASSPATH,变量值为:.,如图1-26所示。

img

图1-26 设置CLASSPATH环境变量

一路单击“确定”按钮,完成CLASSPATH环境变量的设置。经过这个设置后,即使其他Java软件也设置了CLASSPATH,那么在Java类所在的文件夹下执行该类,也是能正确找到该类的。

还有一种方式是执行Java程序时指定--class-path参数,在该参数后给出类路径。让我们切换到任意的目录,如D盘根目录,然后执行下面的命令:

img

结果如图1-27所示。

img

图1-27 使用--class-path参数执行Hello类

提示:Java 11简化了Java程序的编译与运行,直接使用java命令执行Java源文件,即可运行程序,也就是省略了之前版本需要的javac编译过程。例如:

java Hello.java

不过你必须保证之前没有编译过Hello.java,也就是说在执行java命令的目录下不存在Hello.class文件。此外也不要在一个源文件中包含多个类,否则可能会出现找不到main方法所在的类的错误。