classpath 简介

来源:互联网 发布:淘宝海外禁运限运物品 编辑:程序博客网 时间:2024/04/30 09:33

本文的目的是向初学者介绍什么是 classpath,以及如何在项目中组织 classpath。熟悉 classpath 是熟练使用 java/javac 命令的前提。虽然类似的文章非常多,但本文力求做到简单易读。

一、基本用法


classpath 是 Java 最重要的基础概念之一。它是一个编译和运行时都要用到的参数。当没有这个参数时,java 和 javac 命令会取环境变量 CLASSPATH 来代替。如:

javac -classpath . Class1.java        


那么 javac 便会以当前目录(.)作为 classpath。你也可以先将环境变量 CLASSPATH 的值设为“.”,然后执行

javac Class1.java                     


效果是一样的。注意,如果你指定了参数,那么环境变量就会被忽略。所以二者只会取其一。

 

 

 

 

二、classpath 的作用

 


classpath 用来指向系统现有任何一个位置的 java 程序。这样能够提高复用性。比如程序 b 需要用到程序 a 当中的类,那么我不需要将 a 拷贝到 b 那里,只需要在运行 b 的命令中将 classpath 指向 a,那么 b 就可以顺利的引用 a 的类了。

我们知道,java 程序就是某个目录下的一堆 .class 文件,或者打好包的 .jar 文件。所以 classpath 所包含的,也就是目录或 .jar 文件的路径。如果要指向多个程序,路径之间就要用“;”隔开。下面是一个例子:

-classpath .;C:/commons-lang-2.1.jar;C:/commons-collections-3.1.jar


这个 classpath 就依次包含了一个目录和两个 jar 包。

 

 

 

 

三、组织 classpath


当 classpath 很长的时候,我们可以将它们组织一下。为了运行方便,java 程序通常都会提供一个批处理文件(如 run.bat)。文件的内容类似于下面的:

set cp=%CLASSPATH%;commons-lang-2.1.jar;  
set cp=%cp%;program.jar                 
java -classpath %cp% MainClass            


那么就算 classpath 再长,也可以像第二行那样化整为零,添加删除都很方便。这比用环境变量方便的多,所以建议不要依赖于 CLASSPATH 环境变量。

像 commons-lang、commons-collections 等这些类库都是很多 java 程序要经常用到的。我们可以将它们放在一起,然后写一个批处理文件将这些文件都包含到变量中,编译或运行时将这个变量赋给 classpath 参数即可。

 

 

 

 

四、一个小例子


假设我有一个类库 C:/commons-lang-2.1.jar,我在 D 盘根目录下创建一个类,内容如下:

import org.apache.commons.lang.StringUtils;             
public class Class1 {                                   
    public static void main(String[] args){             
        System.out.println(StringUtils.isEmpty(null));  
    }                                                   
}                                                       


其中 StringUtils 这个类是包含在 commons-lang-2.1.jar 当中的,所以编译和运行时需要使用 classpath 来指定。
那么编译命令为:
D:/>javac -classpath C:/commons-lang-2.1.jar Class1.java   

运行命令为:
D:/>java -classpath .;C:/commons-lang-2.1.jar Class1       

注意两个命令的 classpath 参数稍有不同。当指定了 classpath 参数时,java 命令只会在 classpath 中寻找类。所以要执行当前目录下的类,就必须将当前目录加入 classpath。

不管哪种 Java IDE,在配置项目的时候都会有一个“依赖关系”,这就是用来在编译或运行的时候生成 classpath 参数的。
总之,classpath 这东西还是不难理解的。另外留个题目:如果 classpath 中的多个路径都包含 com.program.Class1,那么编译时和运行时会使用哪一个呢?请写程序证明一下。