`

(转贴)Classpath和Codebase

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

分享到:
评论
1 楼 yiding_he 2007-02-27  
转贴要注明出处。这是个好习惯。

相关推荐

    浅析Spring配置中的classpath:与classpath*:的区别

    Spring 配置中的classpath:与classpath*:的区别 Spring 配置中的classpath:与classpath*:的区别是 Spring 框架中一个常见的问题。本文主要介绍了这两种路径的区别、使用场景及注意事项,以帮助读者更好地理解和使用...

    classpath 和path

    ### classpath与path详解 #### 一、概念介绍 在深入了解`classpath`和`path`之前,我们需要先明确这两个环境变量的基本...通过上述步骤和案例分析,我们可以更好地理解和应用`classpath`和`path`的概念及其配置方法。

    Java 中的 ClassPath 和 Package

    Java中的ClassPath和Package是Java开发中至关重要的概念,它们直接影响到Java程序的编译和运行。在这篇文章中,我们将详细探讨这两个主题。 首先,让我们理解什么是ClassPath。ClassPath是Java虚拟机(JVM)查找类...

    关于classpath

    Java的classpath是每个Java开发者都必须了解的关键概念,它决定了JVM(Java虚拟机)在执行Java程序时如何查找和加载所需的类文件。本文将深入探讨classpath的基本原理、配置方式以及如何确保`javac`正确编译运行Java...

    Path和classpath配置详解

    在Java编程环境中,路径(Path)和类路径(Classpath)是两个至关重要的概念,它们对程序的编译和运行起着决定性的作用。本文将深入解析这两个概念,并结合源码和工具,帮助你理解它们的工作原理。 首先,让我们来...

    java中path和classpath的设置

    其中,`path`和`classpath`是最为关键的两个环境变量,它们直接影响到Java程序能否正常编译和运行。 #### 一、Path 的设置 `path`环境变量主要用来指定操作系统能够访问到的可执行文件路径列表。在Java环境中,...

    自学如何使用框架的工具classpath

    在Java等编程语言中,理解和管理`classpath`对于正确地使用框架至关重要。`classpath`是一个环境变量或配置设置,它告诉Java虚拟机(JVM)在哪里寻找类文件,这些类文件包含了运行Java程序所需的类和库。 首先,...

    Classpath Variable 解决办法

    在Java编程环境中,`Classpath`(类路径)是一个至关重要的概念,它是Java虚拟机(JVM)查找和加载.class文件的路径。当我们在开发和运行Java程序时,正确配置Classpath是确保程序能正常运行的关键步骤。这篇文档将...

    jdk的classpath路径和环境配置

    ### jdk的classpath路径和环境配置 在Java开发过程中,正确配置JDK(Java Development Kit)的环境变量是非常重要的步骤之一。它不仅关乎到开发工具能否正常运行Java程序,还直接影响到开发效率与项目的顺利进行。...

    eclipse下的.classpath文件和.project文件

    《Eclipse下的.classpath文件和.project文件详解》 在Eclipse这款流行的Java集成开发环境中,.classpath和.project文件是两个至关重要的配置文件,它们对于项目的构建、编译和运行起着核心作用。本文将深入探讨这两...

    java classpath 理解

    ### Java Classpath 理解 #### 一、在命令行查看 ...通过以上四个方面的详细介绍,我们可以看出 classpath 在 Java 程序中的重要性和灵活性。正确理解和使用 classpath 对于 Java 开发者来说是非常关键的技能之一。

    CLASSPATH 和PATH的配置

    ### CLASSPATH 和 PATH 的配置 #### 一、概述 在Java开发环境中,正确配置环境变量是确保程序能够正常编译和运行的关键步骤之一。本文主要介绍如何正确设置`CLASSPATH`与`PATH`这两个重要的环境变量,特别是针对...

    .classpath

    .classpath

    GNU Classpath

    这些源代码包含了类库的实现,开发者可以通过阅读和修改源代码来理解和改进GNU Classpath的功能。同时,这个版本可能还包含了构建脚本、文档、测试用例,帮助开发者理解如何编译和测试Classpath,以及如何将其集成到...

    path与classpath区别

    下面,我们将详细介绍path和classpath的作用、区别以及它们在Java开发中的应用。 path的作用 path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行JAVA文件,但必须把完整的路径写出来,...

    IKVM.GNU.Classpath

    在标题中提到的"用于处理PDF,或将PDF转换为jpg图片格式时用到的dll",这暗示IKVM.GNU.Classpath可能包含了一些处理PDF文档和图像转换的功能。在.NET环境中,由于原生不支持Java的PDF处理库,如Apache PDFBox或iText...

    classpath备份

    classpath备份

    Java环境配置与设置JAVA_HOME_CLASSPATH_PATH的目的

    Java 环境配置是 Java 开发的基础,我们需要正确地配置 JAVA_HOME, CLASSPATH, PATH 等环境变量,以便正确地编译和运行 Java 程序。在本节中,我们将详细地介绍 Java 环境配置的目的和设置方法。 一、JAVA_HOME ...

    在linux和windows下动态设置classpath调用java类方法脚本代码

    本文将详细讲解如何在Linux和Windows操作系统下动态设置classpath以调用Java类方法,并提供实际示例和文档。 一、Linux环境下设置classpath 在Linux系统中,你可以通过以下几种方式设置classpath: 1. **命令行...

Global site tag (gtag.js) - Google Analytics