服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

classpath和codebase


  概要
  
  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加载其所需要的类的网络位置。例如:
  
  代码:
  --------------------------------------------------------------------------------
  
  
  
  --------------------------------------------------------------------------------
  
  
  这个applet指定了其所用的类可以在服务器上applet所在的目录下找到。
  
  在java application中使用codebase
  
  不仅在applet中可以使用codebase,在application中也可以使用codebase。这样application除了可以使用classpath中的类,还可以使用网络上的类。例如:
  java -classpath c:/work/classes -codebase http://www.company.com/classes sample
  应用程序sample不仅可以使用c:/work/classes中的类,还可以使用http://www.company.com/classes中的类。
  
  classpath和codebase的关系
  
  既然java虚拟机即可以在classpath中加载类,又可以在codebase中加载类,那么classpath和codebase是什么关系呢?实际上,classpath和codebase都是由系统类加载器(class loader)使用的。类加载器在加载一个类的时候,首先在classpath中查找需要的类,然后在codebase中查找,第一个被查找到的类会被加载。例如,在早期的jdk版本中,缺省codebase是空值,如果没有在classpath中指定“.”(当前目录),运行当前目录下的java class时会出现classnotfoundexception;而在晚些版本中,缺省codebase是“.”,所以即使不在classpath中加入“.”,当前目录下的java class仍然可以正常运行。
  
  总结
  
  初学java的朋友一定要掌握classpath和codebase的概念,理解其内涵,如果出现编译、运行程序的过程中出现什么问题,首先应该考虑是否是classpath的问题。实际上,甚至一些非常复杂的应用中,比如服务器端应用,都会因为classpath的设置而出现莫名其妙的问题。如果大家在阅读本文的过程中有什么问题,请提出来大家一起讨论。