一、开始
在写这篇博客之前,我对这些环境变量也不是很了解,虽然以前开始学习java的时候,教程里就要我们配置这些,但是后来用了ide之后,发现这些环境变量都可有可无。
但是如果你想在终端界面,能够很好的运行java程序的话,就需要理解一下这些环境变量和java命令。
二、环境变量的理解
(1)classpath
通常来说,classpath环境变量代表的是类路径,指向的是jdk目录下的lib目录,以及你自己定义的一些java文件所在目录,最重要的一点必须包含当前目录,即将".“添加进去,各个目录之间用”;"隔开。
为什么要包括当前目录呢?原因在于javac编译器会自动从当前的目录下寻找文件,但是java虚拟机却并不会,它仅在类路径中含有“."的时候才查看当前目录,所以如果你不添加当前目录,就会发生下述情况:
其实呢,classpath是可以不设置的,原因在于:
- java默认的类路径下就包括了当前目录
- 并且从jdk1.5以来,java也会自动从jdk目录下找寻lib包,当然,如果你还想引入一些自定义的jar包的话,就需要设置了。
- classpath环境变量一旦设置,java默认的classpath就会被覆盖,需要你自行添加当前目录,至于jdk中lib包,java仍然会自己寻找,可以不添加。
- java自动寻找jdk中的lib,应该不是通过默认的classpath实现的,因为我试过,新建classpath,不添加lib,仍然可以运行。可能是通过命令所在目录来寻找的。
所以说,新建classpath只会覆盖默认的当前目录,而不会影响jdk中的lib包
(2)java_home
对于JAVA_HOME,也是可以不设置的,但是建议设置,因为你在使用一些其他软件时会用到这个环境变量,例如maven。
(3)path
对于path环境变量,是肯定要添加自己jdk目录下bin目录的,只有这样才能运行javac和java命令,否则你只能在bin目录下执行这些命令。
总结
classpath可以不用设置,java会自动配置,除非你还想导入一些其余的jar包,一旦自己设置必须包括当前目录。java_home是推荐设置的,path必须设置,否则很不方便!。
三、javac和java命令的理解
(1)java程序是否存在包名
在使用javac和java编译和运行程序时,如果java程序存在包名,就必须从当前包目录下进行命令,并且在java程序前加入包名 。此时Test类含有包名com.chby不存在的话,就直接从当前目录下命令。
(2)加上绝对路径后的问题
另外,如果你不想这么做,想一打开cmd就直接命令,你就要在java文件之前加上绝对路径,绝对路径就一直到java文件所在目录为止,有没有包名无所谓的 ,此时Test类取消包名com.chby
加上包名,结果还是一样的。
你会发现,当加上绝对路径以后,javac是可运行的,但java命令不能。
解决办法:
- 利用javac的-d参数,可以指定生成class文件的目录,你可以“-d .”,表示class文件生成到当前目录,然后就可以java 文件名。
以上,均为自己理解,若有不同意见,欢迎探讨!