Java环境变量PATH和CLASSPATH

96
SpaceCat 22d8d123 271c 4d80 9c59 6990844a9e37
0.2 2016.03.28 23:34* 字数 1791

Java开发中常用到环境变量的配置,下面简单介绍下Java中经常配置的环境变量:PATH和CLASSPATH。

1、PATH环境变量

1.1 作用简介

安装完JDK(Java Development Kit,Java开发套件)之后,可以在安装目录下找到两个子目录(bin目录和lib目录)。bin目录中包含着Java编译器等可执行文件。

如果要运行执行java命令,必须得执行java命令对应的可执行文件的路径,通常有两种方式:

  • 在%JAVA_HOME%目录下执行。
  • 执行命令的时候,指明路径%JAVA_HOME%/bin/java

但是,这样不是特别方便,这就是为什么配置环境变量。如果将%JAVA_HOME%/bin/,添加到环境变量PATH中。再执行java命令时(无论在哪个目录下执行),系统就会从左到右搜索(这里的顺序很重要,可以利用这个特性覆盖掉某个旧版本的jdk。)环境变量PATH中执行的目录,直到找到对应的可执行文件并执行(找到之后,后面的目录都会被忽略掉)。如果找不到,提示该命令不存在。这就是PATH环境变量的作用。

1.2 如何配置

另外,由于JDK的安装目录中的%JAVA_HOME%/jre/bin目录下也有一些常用的工具,所以一般也将其配置到PATH环境变量中。同时,在配置java环境的同事,不能影响其它环境的运行。所以,以windows下面环境变量的配置(各个目录之间用;隔开)为例,通常将下面的内容加到PATH环境变量的最左侧:

%JAVA_HOME%/bin/;%JAVA_HOME%/jre/bin

2、CLASSPATH环境变量

2.1 作用简介

和PATH变量不同,CLASSPATH环境变量的作用是指定Java类所在的目录(或许它的意思就是PATH of Class)。
当运行java程序的时候,要指定相应的类名,比如,下面的例子中,在C:\test\目录下写一个HelloWorld,并执行:

c:\test>type HelloWorld.java   #查看文本文件的内容
public class HelloWorld{
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println("Hello World!!");
        }
}
c:\test>javac HelloWorld.java   #因为配置了PATH环境变量,在任意目录下都可执行javac

c:\test>dir   #查看编译生成的class文件
2016/03/28  22:13               427 HelloWorld.class
2016/03/28  22:08               152 HelloWorld.java
c:\test>java HelloWorld   #运行HelloWorld(注意,不能加.class后缀)
错误: 找不到或无法加载主类 HelloWorld

这里报错找不到或无法加载主类 HelloWorld,前面说到

CLASSPATH环境变量的作用是指定Java类所在的目录。

下面看下此时环境中CLASSPATH环境变量的值是什么:

c:\test>echo %CLASSPATH%
C:\Program Files\Java\jdk1.8.0_51\lib\tools.jar;C:\Program Files\Java\jdk1.8.0_51\lib\dt.jar
c:\test>

果真,没有HelloWorld.class所在的目录。下面我们通过手动指定CLASSPATH解决该问题:

c:\test>java -classpath . HelloWorld
Hello World!!
c:\test>

实际上,和PATH环境变量也是由左到右搜索的,所以,在向CLASSPATH中添加新的目录时,通常将其放在最左侧。下面的例子中,在指定-classpath选项的参数时,引用了%CLASSPATH%环境变量:

c:\test>java -classpath .;%CLASSPATH% HelloWorld
错误: 找不到或无法加载主类 Files\Java\jdk1.8.0_51\lib\tools.jar;C:\Program
c:\test>java -classpath ".;%CLASSPATH%" HelloWorld
Hello World!!
c:\test>echo ".;%CLASSPATH%"
".;C:\Program Files\Java\jdk1.8.0_51\lib\tools.jar;C:\Program Files\Java\jdk1.8.0_51\lib\dt.jar"

ps:如果刚装完JDK,没有配置环境变量,那么缺省的%CLASSPATH%环境变量的值是.,也就是当前目录。

2.2 通常如何配置

Java中通常将环境变量CLASSPATH配置为.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar。其中为何包含.,在上面的例子中已经看得很清楚了。下面的内容大概介绍了另外两个的作用:

dt.jar:运行环境类库,主要是Swing包,这一点通过用压缩软件打开dt.jar也可以看到。如果在开发时候没有用到Swing包,那么可以不用将dt.jar添加到CLASSPATH变量中。

tools.jar:工具类库,它跟我们程序中用到的基础类库没有关系。我们注意到在Path中变量值bin目录下的各个exe工具的大小都很小,一般都在27KB左右,这是因为它们实际上仅仅相当于是一层代码的包装,这些工具的实现所要用到的类库都在tools.jar中,用压缩软件打开tools.jar,你会发现有很多文件是和bin目录下的exe工具相对性的,如下图:

tools_jar

From:The use of CLASSPATH

2.3 指定CLASSPATH的注意事项

Class Path Wild Cards

Class path entries can contain the base name wildcard character (), which is considered equivalent to specifying a list of all of the files in the directory with the extension .jar or .JAR. For example, the class path entry mydir/ specifies all JAR files in the directory named mydir. A class path entry consisting of * expands to a list of all the jar files in the current directory. Files are considered regardless of whether they are hidden (have names beginning with '.').
A class path entry that contains an asterisk () does not match class files. To match both classes and JAR files in a single directory mydir, use either mydir:mydir/ or mydir/:mydir. The order chosen determines whether the classes and resources in mydir are loaded before JAR files in mydir or vice versa.
Subdirectories are not searched recursively. For example, mydir/
searches for JAR files only in mydir, not in mydir/subdir1, mydir/subdir2, and so on.
The order in which the JAR files in a directory are enumerated in the expanded class path is not specified and may vary from platform to platform and even from moment to moment on the same machine. A well-constructed application should not depend upon any particular order. If a specific order is required, then the JAR files can be enumerated explicitly in the class path.
Expansion of wild cards is done early, before the invocation of a program's main method, rather than late, during the class-loading process. Each element of the input class path that contains a wildcard is replaced by the (possibly empty) sequence of elements generated by enumerating the JAR files in the named directory. For example, if the directory mydir contains a.jar, b.jar, and c.jar, then the class path mydir/* is expanded into mydir/a.jar:mydir/b.jar:mydir/c.jar, and that string would be the value of the system property java.class.path.
The CLASSPATH environment variable is not treated any differently from the -classpath or -cp options. Wild cards are honored in all of these cases. However, class path wild cards are not honored in the Class-Path jar-manifest header.

Folders and Archive Files

When classes are stored in a directory (folder), such as c:\java\MyClasses\utility\myapp, then the class path entry points to the directory that contains the first element of the package name (in this case, C:\java\MyClasses, because the package name is utility.myapp).
When classes are stored in an archive file (a zip or JAR file) the class path entry is the path to and including the zip or JAR file. For example, the command to use a class library that is in a JAR file as follows:

java -classpath C:\java\MyClasses\myclasses.jar utility.myapp.Cool

Multiple Specifications

To find class files in the directory C:\java\MyClasses and classes in C:\java\OtherClasses, you would set the class path to the following. Note that the two paths are separated by a semicolon.

java -classpath C:\java\MyClasses;C:\java\OtherClasses ...

Specification Order

The order in which you specify multiple class path entries is important. The Java interpreter will look for classes in the directories in the order they appear in the class path variable. In the previous example, the Java interpreter will first look for a needed class in the directory C:\java\MyClasses. Only when it does not find a class with the proper name in that directory will the interpreter look in the C:\java\OtherClasses directory.

From: docs.oracle.com

3、JAVA_HOME环境变量

这个是不重要的,题目中我都没有提它。它唯一的作用就是,前面两个环境变量的配置中引用了它,所以,要将其配置为:

C:\Program Files\Java\jdk1.8.0_51\

如果前面环境变量的配置都显式指定了完成的路径,那么完全可以不用配置JAVA_HOME环境变量。

技术
Web note ad 1