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).

相关文章推荐

java 之 Applet code/codebase路径问题

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

SOA: UBER工程代码架构的拓展和演变SERVICE-ORIENTED ARCHITECTURE: SCALING THE UBER ENGINEERING CODEBASE AS WE GROW

像很多初创型公司一样,Uber的架构一开始也是一整块的,或者说是整体的、不可分割的,服务端部署在一个城市,对外整体上是单个节点。这个也迎合了当时服务范围和功能选项有限的业务场景。可执行代码部署在单个节...
  • cmdssd1
  • cmdssd1
  • 2016年07月11日 23:10
  • 2708

Codebase Components v3.42

  • 2006年02月23日 09:05
  • 4.02MB
  • 下载

PHP CodeBase: 判断用户是否手机访问

随着移动设备的普及,网站也会迎来越来越多移动设备的访问。用适应PC的页面,很多时候对手机用户不友好,那么有些时候,我们需要判断用户是否用手机访问,如果是手机的话,就跳转到指定的手机友好页面。这里就介绍...

Java RMI codebase 小议

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

【无需解决】Firefox中,对某网页,拷贝文字时出现提示:您的firefox安全限制限制您进行剪贴板操作,请打开’about:config’将signed.applets.codebase_prin

【问题】 用Firefox浏览网页,对于这个地址: http://www.jb51.net/article/25192.htm 想要拷贝其中的某个标题文字时,出现提示: 您的fir...

Codebase Components v3.41

  • 2006年02月23日 09:05
  • 3.98MB
  • 下载

Codebase Server 6.53

  • 2009年06月27日 20:08
  • 2.13MB
  • 下载

在ant脚本里面,打印显示项目的classpath

--> 结果,显示的内容全部在一行: print_classpath: [echo] Classpath = D:\workspace\lms\webapp\WE...
  • hardwin
  • hardwin
  • 2012年05月10日 17:56
  • 5212

java classloader classpath 张孝祥

  • 2014年01月08日 08:11
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Classpath和Codebase
举报原因:
原因补充:

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