java0108-2020-11-06
1、在没有经过配置的情况下,一般只能在.class文件所在的文件路径底下执行该java可执行程序,如下图:在往上走一层以后就不能执行该demo.class可执行程序了,更不用说移动到不同的盘符(如上图已进入C盘)底下去执行该java可执行程序了,这时,就需要考虑是否有办法能够使.class可执行程序在任何路径底下能执行,到这里,首先想到的就是模仿JDK安装时那样,将.class可执行程序所在文件夹路径设置到环境路径,于是便有了以下两种办法:
1.1、临时设置:设置方法如下图,当java命令执行时会启动java的虚拟机,而虚拟机会首先到classpath底下去找有没有此.class文件,有的话就被首先执行。为了验证java命令执行时是首先去找classpath的这个原理,可以先将原来设置过的路径抹掉,方法如下图:然后再将helloworld.java源文件中打印内容修改一下以作区分:
接着用javac命令各编译一次(因为用的还是原来的源文件,所以使用的编译路径和命令都一样,表面看是没有太大区别,但是实际上helloworld.java源文件的内容已经按上面两个图做了部分修改了),每一次编译完要立刻将对应的demo.class文件剪切放到对应盘符底下(因为编译“D:hello world!”时本来路径就在D盘下的D:\JAVA\javadoc\0107了,所以编译完成之后不用剪切移动就可以进行正式实验了),如下图:这时,先验证一下是不是对应盘符底下的demo.class文件都打印输出含有各自盘符的"*:hello world!",如下图:在上图对打印结果进行输出时碰到了一个小意外,因为demo.class文件是被复制到c:\底下而不是C:\Users\niewe这个用户文件夹底下,所以导致报错,这个只需要在执行命令时看准文件所在文件夹路径就行。
按道理,到了这个地步,也就是有两个同名的文件demo.class被分别放到了不同的盘符底下,在没有设置环境变量的情况下,理论上应该只能在各自对应的文件路径上才能够被执行,这个应该毋庸置疑,但是,一旦其中一个盘的存放路径被设置成了环境变量,那么到另一个盘符底下执行这个demo.class文件时,会发生什么情况呢?是系统报“产生冲突”的错呢?还是先执行自己盘符底下的.class文件呢?抑或是执行环境变量所指定盘符所在的那个路径底下的.class文件呢?还是干脆就不执行呢?当然了,结果还是先执行环境变量里指定的了。下面将对设置环境变量的这条命令做一些变化,变化的地方在于是否末尾带分号,然后观察其不同:
首先,将环境变量都抹掉,恢复成原始模样,然后一个盘底下还是只保留一份demo.class,分别打印的还是带有各自盘符的"*:hello world!"。
然后,第一步,同样地,先进入到另一个盘d(为了便于观察实验现象,但使用的原理还是和前述内容一致),将c盘的.class文件所在路径设置成环境变量并运行,如下图:这时,如果将c盘底下的这个demo.class文件删除,然后再运行一遍,按前述原理来说应该是找不到c盘.class文件所以会找D:\JAVA\javadoc\0107这个路径底下的demo.class文件执行,而实际上,系统也的确是这样做的,如下图:这时候,再将原来c盘那个存储过demo.class文件的路径再设一遍成classpath,不过注意这次看清楚了,末尾是没有带分号的,然后再运行一遍demo文件,但是却出现如下图现象:通过前后比较,可以看到,加上分号会在classpath指定路径下找不到时再在当前路径找一遍,而没加分号的时候就只找classpath指定路径,找不到也不会再去别的地方再找,两者一比较,看似前者会更好,但是对于开发者而言却并不友善,因为原本就是为了测试指定路径下的某.class的功能,万一当前路径下已经有相似功能的文件时,就会导致预料之外的现象出现在运行结果里(特别是编写过程中源文件由于存在bug而不能正常运行时),而且最重要的是配置环境变量的目的就是告诉系统去找指定路径下的指定文件而服务的,如果指定文件不存在了应该通过报错来提示用户该文件不存在然后督促用户去查找和修改此错误,而不应该是随便执行一个当前路径下的同名文件然后返回一个不明结果。
当然了,在某些情况下,是难免会遇到使用多路径的情况,这个时候才需要在两个指定路径之间添加分号,但是注意,最后一个路径的末尾依旧还是不加分号。
如果还是实在是需要在找完指定路径之后再在当前路径找一遍,那么可写成如下,用"."指代当前路径即可:而path环境变量的查找顺序和classpath又有所不同,path环境变量是先在当前路径下找,找不到再去path里所指定的路径下找。
1.2、永久设置
永久设置到电脑系统设置->高级环境变量里配置,但是由于.java源文件和编译生成的.class文件一般都处于同一路径底下,所以一般直接使用上面所述那种临时设置环境变量的方法。
如果是.exe可执行文件,一般需要配置path,而java的执行文件一般配置classpath。
配置path的时候如果还希望添加上原有的path指定路径,可以在分号后加上%path%,如下图: