首先看一下path这个环境变量的作用。要想明白path的作用,首先先要考虑一个问题,比如:
当我们在命令行当中,输入”ipconfig”这个命令然后按下回车键之后,为什么能现实出当前计算机网卡的相关参数(包括IP地址,子网掩码等)?请大家想一想!
其实仔细的想一想,就会大概的猜出来,其实但你执行ipconfig命令的时候,实际上是调用了一个程序,这个程序在什么地方呢?在操作系统的安装目录当中,具体是在\WINDOWS\system32\ipconfig.exe这个位置。当你执行ipconfig的时候,其实就是运行了ipconfig.exe这个程序(如果大家想验证的话,可以尝试把ipconfig.exe这个文件剪切到其他的目录里面,再尝试执行这个命令,就会发现这个命令已经不能执行了)。根据这样的一个情况我们可以大概的猜测一下,就是当我们执行了javac和java这两个命令的时候,也应该是类似的,就是说在硬盘上应该有java.exe和javac.exe这两个文件。那么这两个文件在什么地方呢?就在JDK安装目录下的bin目录,大家去找一找,不难发现这两个文件。那么现在问题就来了,当我们在命令行当中执行某个命令的时候,操作系统是怎样找到这个命令所对应的exe文件(有的时候是bat文件,因为这种情况目前我们还用不少,所以在这里就不再讨论了)?
这个时候就轮到我们的path这个环境变量大限身手了。首先我们先看一下现在path的值是什么,在命令行当中输入set path 这个命令就可以看到了:
由这个结果我们可以看出,环境变量的值,是一系列的目录,目录和目录之间使用“;”分割开。当你在命令行当中执行ipconfig 这个命令的时候,首先操作系统会从path变量所制定的第一个目录,也就是”C:\Program files\Common Files\NetSarang”这个目录当中寻找ipconfig.exe,如果没有找到就会到第二个目录当中寻找。以此类推,直到找到为止。如果在Path所指定的所有目录当中都没有找到,就会报出一个错误。同样的,如果你想在命令行当中编译或者运行Java程序,就必须使用到JDK所提供的java和javac这两个命令,所以我们要把java.exe和javac.exe所在的目录加入到path这个环境变量当中,这样操作系统就可以顺利的执行这两个命令了。
其次,我们看classpath的作用。在了解这个环境变量的作用之前,首先还是先要了解一下java程序运行的步骤。当我们执行“java Test”这样的命令时,会启动Java虚拟机,并执行如下的动作:
classpath的作用是体现在上述的第一个步骤。
执行“java Test”这样的命令时,java虚拟机会寻找一个名为Test.class的文件,然后由类装载器装载这个类,那么问题就是类装载器究竟要到哪个目录里去寻找Test.class这个文件呢?这个时候classpath就起作用了,classpath值的设置方式和path类似,都是一系列的目录(当然还可能包括jar文件,其实jar文件也是目录,目录里面有很多的class文件),java虚拟机就是到这些目录当中去寻找所需要的class文件。比如说在我的g:\src目录当中有一个Test.java文件,编译过后生成了Test.calss文件。这个时候我们想执行这个文件,就要执行“java Test”命令,类装载器会从classpath所指定的目录当中去寻找Test.class这个文件,如果在classpath所指定的第一个目录当中没有找到,就到第二个目录去找,直到找到为止,如果在所有的目录当中都没有找到,就会报出一个错误。在一般的教科书上,都会让学生把classpath的值设置为“.”,这是因为“.”代表的是当前目录,什么叫当前目录呢?
当打开命令行时,在“>”之前的目录就是当前目录,也就是说在这个目录下执行“java Test”命令,java虚拟机的类装载器就会在g:\src下寻找Test.class文件。