1. 为什么要说这个问题?
想起来两年前刚学习Java时,所有教程第一步都是要求先要设置环境变量。自然不解这是个什么东西,随后网上找答案。
现在想来感觉当时看到的答案都是神神叨叨、含糊不清,根本没有人把问题说明白!使得你「知其然而不知所以然」。当然也有可能是当时的我没看明白吧……
现在,相信我!看了我的博客,你不用再找别的地方了!
2. 什么是环境变量?
环境变量 就是英文直译:Environment Variable 。
变量 知道吧?
对,就是可以随意给其赋值的一个存储单元。
那么环境 呢?
首先,你把操作系统当做是一个最大的软件,其它软件如Office、JVM、LOL等等都是运行在这个软件之内的小软件。那么,相对于这些小软件来说,它们所处的「环境」就是操作系统这个软件。
最后,合起来就是“环境中的变量”
「环境变量」就是操作系统这个软件中的变量,即:操作系统提供给你的全局变量!
环境变量有什么作用呢?
环境变量没什么特别的,变量在任何程序中的作用都是“被赋值/被取值”!这个全局变量操作系统可以使用,其内的小软件也可以使用!
3. 环境变量长啥样?有哪些?
变量长啥样,环境变量就长啥样……
XXX = XXX
在Windows中
下面是WIN10。Windows是视窗系统,我们不必显式的使用
XXX=XXX
这种方式,因为系统给我提供了窗口,可以直观的看到并编辑。如下图:在Linux中
设置:
在
/etc/profile
文件中设置,export
的意思就是将局部变量设置为环境变量。现有的变量是被这样一行代码设置的:export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
这几个环境变量已经有一些默认值了,不过我们可以追加内容,比如修改
PATH
:# : 的意思是并列 PATH = /abc/def:$PATH
查看:
查看全部,使用
env
命令即可。查看单个,可以使用
echo
:如echo $JAVA_HOME
。
4. 在Java中
我们终于知道了环境变量是什么以及它的作用了。那么,具体在Java中会用到哪些呢?它们的作用又是什么呢?
有一点需要首先了解:环境变量大体上是给操作系统的直接上层程序用的。比如Linux中的
shell
、.sh
文件;Windows中的cmd
、.bat
文件。
常见的Java相关环境变量及其作用
PATH
PATH
是操作系统用的,用来指定操作系统需要使用到的可执行程序的位置。对于Java来说,通常需要把JDK的bin目录添加进入PATH
中,这样你就可以在任意目录下使用bin下面的可执行程序,如javac.exe
、java.exe
等。这个变量一定要保证将JRE/JDK的bin纳入其中(这里我说的其实不严谨,你可以把
javaw.exe
等这类文件复制一份放到任意一个PATH
路径下,不一定是JRE/JDK也行),这样很多Java程序才能启动,比如Eclipse
。JAVA_HOME
JAVA_HOME
是一个约定,通常它指的是JDK的目录。如果需要JDK的话,大部分程序会默认去环境变量中取JAVA_HOME
这个变量。例如,Tomcat的
.bat/.sh
文件中就会默认去取JAVA_HOME
来用。所以,这个变量最需要设置。设置它,可保你万无一失,一生平安……
JRE_HOME
同样,这也是一个约定的变量,通常指JRE目录。其实大部分Java程序不需要JDK,而是只需要其子集JRE,所以很多程序也会去取这个变量来用。
例如,Tomcat中某些
.bat
文件中这样说到:rem JAVA_HOME Must point at your Java Development Kit installation. rem Using JRE_HOME instead works as well. rem rem JRE_HOME Must point at your Java Runtime installation. rem Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME rem are both set, JRE_HOME is used.
大意是说:Tomcat去取这俩变量,只要任意一个不为空就行,都不为空就用JRE_HOME了。因为Tomcat不需要JDK中的工具,它只是运行Java程序而已。
这个变量如果你明确知道应用程序只需要设置这个就行(比如上面Tomcat的注释),那么它可以代替JAVA_HOME,且最好就用这个。
CLASSPATH
CLASSPATH
是约定的一个可以设置我们自己的.class, jar
文件所在目录的变量。不过某个Java程序可以自己决定取与不取这个变量。Tomcat 在某些情况下会去取,你自己的Java程序你不设置就会忽略它的。这和Java可执行程序:
java.exe
的可选配置-cp/-classpath
不是一个东西,仅是用意相似:java [-options] class [args...] (执行类) 或 java [-options] -jar jarfile [args...] (执行 jar 文件) 其中选项包括: -cp <目录和 zip/jar 文件的类搜索路径> -classpath <目录和 zip/jar 文件的类搜索路径> 用 : 分隔的目录, JAR 档案 和 ZIP 档案列表, 用于搜索类文件。
结论:基本上,你不需要它。
CATALINA_HOME
这是Tomcat用的。叫CATALINA这个名字我估计是因为Tomcat默认服务(也就
<Service></Service>
标签)的名字就是CATALINA。当然,是不是其实不重要,毕竟变量的名字可以随意起(但最好见名知意),重要的是它存什么值。它的值代表当前tomat根目录,比如:E:\apache-tomcat-7.0.55
。这个变量,仅当你移动了
.bat/.sh
等用来启动Tomcat的文件(就是不在原来的tomcat\bin
下面了)时才需要指定。比如,在Linux中你将catalina.sh
复制到/etc/rc.d/init.d/
下做自启动服务时就需要设置一下。
Java代码中也有API能获取环境变量:
获取并打印
// 打印单个环境变量 final String env = System.getenv("PATH"); System.out.println(env); // 打印所有环境变量 final Map<String, String> envMap = System.getenv(); for (Map.Entry<String, String> env : envMap.entrySet()) { System.out.println(env.getKey() + "=" + env.getValue()); }
总结
最后我们总结一下:
需要在操作系统下设置的变量:
PATH
中包含JRE/JDK的bin
目录。JAVA_HOME
或者JRE_HOME
。都设也可以,偷懒就只设JAVA_HOME
就可以。
很少需要设置的:
CLASSPATH
、CATALINA_HOME
。
转载注明出处:http://blog.csdn.net/u010297957/article/details/51334951