Classpath和Codebase

转载 2006年05月22日 17:21:00

[精华] [转载]Classpath和Codebase
http://www.chinaunix.net 作者:eclipse  发表于:2004-04-09 16:17:40 
【发表评论】 【查看原文】 【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&#59;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 codebase=&quot;.&quot; code=Animator.class width=460 height=160>;

--------------------------------------------------------------------------------


这个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的设置而出现莫名其妙的问题。如果大家在阅读本文的过程中有什么问题,请提出来大家一起讨论。


www.javaunion.org 非鱼,2002.08.15


 


 

==============================================================================

补充:

from http://java.sun.com/j2se/1.3/docs/tooldocs/win32/classpath.html

Class paths to the .jar, .zip or .class files. Each classpath should end with a filename or directory depending on what you are setting the class path to:

  • For a .jar or .zip file that contains .class files, the class path ends with the name of the .zip or .jar file.
  • For .class files in an unnamed package, the class path ends with the directory that contains the .class files.
  • For .class files in a named package, the class path ends with the directory that contains the "root" package (the first package in the full package name).

Classpath和Codebase

  概要 Classpath和Codebase是Java中非常重要的两个概念,初学者如果没有掌握这两个概念,在遇到诸如 ClassNotFoundException或者相关的异常时不知所措。另外,很...
  • jvincent
  • jvincent
  • 2007年03月22日 08:27
  • 553

object classid和codebase

网页中的object其实就是一个COM组件(概念可以网上查一下),classid就是这个COM组件在系统中注册的一个ID值,有了这个ID值系统才能找到这个COM组件对应的DLL文件,就像普通的软件用其...
  • LeehomeYU
  • LeehomeYU
  • 2017年05月18日 10:41
  • 435

java 之 Applet code/codebase路径问题

java课本上给了个applet实例,,当我敲完后,,发现“找不到class” 仔细研究了一下,,发现问题如下:课本上给的applet为裸包即没有package声明包路径,而我的却自己定义了,,,上...
  • XuWei_XuWei
  • XuWei_XuWei
  • 2012年12月25日 09:25
  • 2209

git vs hg

看到一篇文章,重新又勾起了我对版本控制工具的回忆和兴趣,拿出最好用的两种来比较比较吧:git和hg 。 1.对象模型(Object Model) hg是采用增量式存储的版本控制系统,它保存相邻版本间的...
  • shaobo_wu
  • shaobo_wu
  • 2010年12月22日 03:10
  • 10603

Assembly.CodeBase及Assembly.Location在Office编程的的区别

一直没时间去琢磨CodeBase及Location属性的区别在哪里。最近参与Office的VSTO编程,终于有时间研究了一小下。Assembly.CodeBase返回的是file:///形式的字符串,...
  • smallmark
  • smallmark
  • 2005年03月28日 14:17
  • 1472

cab包的codebase与version

一、codebase="/SomeCab.cab"  本地有,就不下载 二、codebase="/SomeCab.cab#version=2,0,0,1" 大于本地版本才下载 三、code...
  • wwwDotFa
  • wwwDotFa
  • 2012年05月14日 10:50
  • 3435

CodeBase

        昨天在修改程序时,遇到了一个以前曾经解决的问题,当时又是在网上搜索,又是问同事,忙活了一阵才搞定的,不过遗憾的是没有做好记录,结果花了近半个小时的时间去寻找这部分代码,总结一下,完全是...
  • eastspy
  • eastspy
  • 2005年01月05日 09:39
  • 863

Java RMI codebase 小议

codebase问题其实是一个怎样从网络上下载类的问题,我想不只是在Jini和RMI程序开发中要用到。只要需要从网络上下载类,就要涉及到codebase问题。例如applet等。但是因为我对apple...
  • bigtree_3721
  • bigtree_3721
  • 2016年01月31日 11:54
  • 918

Spring下面的classpath 和 classpath* 区别的简单讲解

classpath 和 classpath* 区别: classpath:只会到你指定的class路径中查找找文件; classpath*:不仅包含class路径,还包括jar文件中(class路径)...
  • gdfgdfk
  • gdfgdfk
  • 2015年12月16日 16:29
  • 3985

环境变量——关于PATH与CLASSPATH的区别

在安装JDK时需要添加环境变量,经常使用的环境变量有两个:PATH与CLASSPATH,下面总结一下环境变量的作用。 PATH是系统用来指定可执行文件的完整路径。当在CMD中执行命令时,如果执行的可执...
  • ZF_C_CQUPT
  • ZF_C_CQUPT
  • 2016年03月30日 22:59
  • 3108
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Classpath和Codebase
举报原因:
原因补充:

(最多只允许输入30个字)