概要
classpath和codebase是java中非常重要的两个概念,初学者如果没有掌握这两个概念,在遇到诸如classnotfoundexception或者相关的异常时不知所措。另外,很多其它方面的错误往往也和classpath有关。本文将详细解释这两个概念,并且描述在命令行方式和集成开发环境(以jbuilder为例)中的设置方式。
什么是classpath
classpath是java中的重要概念,它描述了java虚拟机在运行一个class时在哪些路径中加载要运行的类以及运行的类要用到的类。简单的说,就是像操作系统的path,只不过这个classpath是由java的虚拟机来使用查找需要加载的类,而操作系统的path是由操作系统用来查找用户输入的可执行程序。同path一样,classpath也是一个环境变量,可以通过set命令来设置。
classpath和java包的关系
java的包(package)和classpath关系密切。包是以“.”分割的,sun建议使用域名的逆向排列来区分不同的包,以避免冲突,如com.company.util。在一个包里的类在存储的时候需要存储在和包名相同的目录里,如上述com.company.util包中的sample.class,要存储在com/company/util目录中。
classpath有两种表达方式,一种是指向目录的classpath,如c:/work/classes,表示c:/work/classes目录是一个classpath条目;另一种方式是指向压缩文件的classpath,如c:/work/util.jar,表示c:/work/util.jar文件是一个classpath条目,任何一个包含java类的zip格式的压缩文件都可以作为classpath的条目。
那么classpath和包到底是什么关系呢?简单的说,就是java虚拟机在加载类的时候以这样一种方式查找具体的类文件:classpath+包存储的目录+具体的类文件。如classpath中有一个c:/work/classes条目,需要加载的类是com.company.util.sample.class,那么在加载这个类的时候,虚拟机会查找c:/work/classes/com/company/util目录,如果sample.class在这个目录中,虚拟机就可以找到,如果这个类不在这个目录中,同时也不在任何一个其它classpath中,那么虚拟机会抛出一个classnotfoundexception。
classpath的顺序和类版本冲突
java虚拟机在加载类的时候查找classpath是有顺序的,如果在classpath中有多个条目都有同一个名称的类,那么在较前位置的类会被加载,后面的会被忽略。这种按照顺序的类加载可能会导致类的版本冲突。例如classpath=c:/servlet2.2/servlet.jar;c:/servlet2.3/servlet.jar,那么在实际应用的过程中,你使用的是servlet2.2,而不是servlet2.3。很多时候如果不注意这一点,可能会导致奇怪的异常。
命令行状态下的classpath设置
命令行状态下的classpath可以通过两种方式设置。
一种是直接设置环境变量,例如在windows环境下,我们使用set命令:
set classpath=c:/work/classes;c:/work/util.jar
另一种方式是在执行javac、java或者其它java命令时直接指定classpath:
java -classpath c:/work/classes;c:/work/util.jar com.company.util.sample
集成开发环境下的classpath设置
集成开发环境中设置classpath一般通过其用户界面进行,各种集成开发环境的classpath设置各不相同,我们以jbuilder为例来说明集成开发环境下的classpath。
1.设置jbuilder的library
jbuilder中的classpath要通过类库来设置,首先选择tools->configure library,然后点击new按钮,点击add...,可以选择要增加的类库,这个类库可以是目录,也可以是zip格式的压缩文件,如.jar或者.zip。
2.设置项目需要用到的library
在设置了类库之后,在jbuilder中运行一个class时并不会马上查找你加入的类库,而是要在project->project properties->path->required library中设置,选择add...按钮,你就可以增加自己的classpath条目了。
什么是codebase
使用java语言编写的程序,不仅可以在本地的classpath中加载类,也可以根据需要从网络上下载类。为了使java程序可以从网络上下载类,我们需要使用codebase,codebase指定了java程序在网络上何处可以找到需要的类。
在java applet中使用codebase
众所周知,可以在java applet中使用codebase指定applet加载其所需要的类的网络位置。例如:
代码:
--------------------------------------------------------------------------------
闽公网安备 35060202000074号