kooyee ‘s blog

开源软件, 众人努力的结晶, 全人类的共同财富
posts - 103, comments - 55, trackbacks - 0, articles - 66
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Java Classpath全解

Posted on 2007-07-14 05:42 kooyee 阅读(1255) 评论(0)  编辑  收藏 所属分类: Java
         java 的新入门者对classpath往往比较困惑,为何在开发环境中能运行的东东出去就不好,或在外面运行的东东挺溜的进了开发环境就死菜,烦死了! 看完俺这篇文章包您万事无忧(夸张点吧) :)呵呵
 
         java的优点就是他是一个自动支持网络功能的东东,举一个简单例子来将 比方有一个Application他用到了java.lang.String(事实上要是有一个程序没用到它,太难以想象了 :)), 和com.shinechina.MyClass(我自己写的两个版本) 这两个类
版本1:
package com.shinechina;
public class MyClass 
public static void main(String args[]) {
             String str 
= "版本1: hello, welcome to chinaasp java 技术"
             System.out.println(str); 
   }
 
}


版本2:
package com.shinechina;
public class MyClass 
public static void main(String args[]) 
       String str 
= "版本2:hello, welcome to chinaasp java 技术"
       System.out.println(str); 
  }
 
}
 


现在我要运行它了 java com.shinechina.MyClass 现在问题来了,也许com.shinechina.Myclass在c:, d:, 甚至在阿龙老兄,javabeans老兄,的机器上也有这么个东东,里面是些很cool的 java怎么知道到何处找呢?
 
他到底该怎么办 假定版本一在 c:/mylib/comshinechina/MyClass.java, 假定版本二在d:/mylib/comshinechina/MyClass.java 注意:不要忘了编译成class文件吆, java文件是不能执行的
cd c:/mylib/comshinechina/ javac *.java
cd d:/mylib/comshinechina/ javac *.java

有了: 他先到机器的CLASSPATH去找。假设是windows系统 c:/mylib;d:/mylib;d:/jdk1.2.2/lib/t.jar; 或unix系统 /home/local/:/usr/local/:/usr/local/jdk1.2.2/lib/rt.jar 好, c:/mylib下他找到了com目录,有戏, 又往下找又有shinechina目录,目录下找到了MyClass.class, Ok 就是他了, 至于d:/mylib我的版本2的MyClass他就不理会了, 至于String是在rt.jar压缩包中待会再讲他 执行的结果就是:
版本1: hello, welcome to chinaasp java 技术 

反过来如果d盘的路径在c:之前,执行的结果就是
版本2: hello, welcome to chinaasp java 技术

依次类推, 只有在类路径上第一个找到的才会执行,你要控制他执行那一个须如此: java -classpath d:/mylib;%classpath% com.shinechina.MyClass 执行的结果就是
版本2: hello, welcome to chinaasp java 技术

开发环境中的执行就是这样,总有一个地方指定类路径的

注意,开发环境往往不去读系统路径, 这也就是在外面运行的东东挺溜的进了开发环境就死菜的原因喽。 比如说jbuilder, jdevoloper从菜单project->project properties...->paths标签->Add...->添加定义好的library点ok或者new->输入name和classpath->ok 这个东东就被添加到了classpath中(运行时可在message view中看到)

再比如说visualAge for java , 点中你要运行的类->鼠标右击选中特性->类路径标签
1。->编辑->全选,好,开发环境中的所有类都能找到了
2。->立即计算(只选中你需要的类, 如果有用class.forName之类通过程序显式装载的类的话,需要自己从编辑中手工家入了, 开发环境每能力帮你算出来了,如果内存没有问题的话,直接编辑->全选更方便吆)
3。如果你的类并不想引入开发环境的话,点中添加额外路径,编辑(下面的一个), 我不喜欢这样, 就不详细介绍了 高手的话,直接用jdk, 那么只好麻烦你要么加到系统classpath中(unix下为$CLASSPATH), 要么编译运行时显式指明classpath

下面介绍一个初学者最容易犯的错误 还以上节介绍的例子 假定版本一在 c:/mylib/comshinechina/MyClass.java 编译后c:/mylib/comshinechina/MyClass.class 怎么指定classpath呢?
常见毛病 1。c:\mylib\comshinechina 2。c:\mylib\com
正确 1。c:\mylib 2。c:\mylib


设置类路径结构

可通过对 JDK 工具使用 -classpath 选项(首选方法)或设置 CLASSPATH 环境变量来设置类路径。
C:> jdkTool -classpath path1;path2...
C:> set CLASSPATH=path1;path2...
每个 path 以文件名或目录结尾,该文件名或目录取决于将类路径设置成什么:
对于包含 .class 文件的 .zip 或 .jar 文件,路径以 .zip 或 .jar 文件名结尾。 对于未命名包中的 .class 文件,路径以包含 .class 文件的目录结尾。 对于已命名包中的 .class 文件,路径以包含“root”包(完整包名中的第一个包)的目录结尾。 用分号来分隔多个项目。

使用 set 命令时,需要省略等号两边的空格(=)。其中 jdkTool 可以为 java、javac、javadoc,等等。有关详细列表,参见 JDK 开发工具。 说明 类路径告诉 Java 应用程序去哪里查找第三方和自定义类 -- 即不是 Java 扩展或 Java 平台一部分的类。

在 JDK 1.2 中,JVM 和其他 JDK 工具通过依次搜索平台库、库扩展和类路径来查找类(有关搜索策略的详细信息,参见如何查找类)。 多数应用程序的类库都会充分利用扩展机制。因此,只有想要加载某个类库 (a) 未位于当前目录或其分枝包中 且 (b) 未位于扩展机制所指定的位置时,才需设置类路径。

如果用户是从旧版本 JDK 升级而来,则启动设置可能包括不再需要的 CLASSPATH 设置。这时应该删除任何非应用程序特定的设置。有些使用 Java 虚拟机的第三方应用程序可能修改 CLASSPATH 环境变量以包括它们使用的类库。这种设置可以保留。

可通过在调用 JVM 或其他 JDK 工具时使用 Java 工具的 -classpath 选项改变类路径(例如: java -classpath ...)。这是改变类路径的首选方法。还可通过使用 CLASSPATH 环境变量改变类路径。 注意:JDK 1.2 缺省类路径是当前目录。设置 CLASSPATH 变量或使用 -classpath 命令行开关将覆盖缺省值,因而如果想要在搜索路径中包括当前目录,则必须在新设置中包括“.”。

类可以存储在目录(文件夹)或归档文件(例如 classes.zip 或 classes.jar)中。有关归档文件的详细信息和类路径的工作原理,参见本文档最后的理解类路径和包名。

重要说明:JDK 旧版本在缺省类路径中还包括 /classes 项。该目录仅供 JDK 使用,且不用于应用程序类。应用程序类应该放置在 JDK 外部的目录。这样,安装新 JDK 时不必需要重新安装应用程序库。为了与旧版本的兼容性,使用 /classes 目录作为类库的应用程序在当前版本中仍能运行,但不能保证在以后的版本中它们还能运行。

使用 Java 工具的 -classpath 选项 Java 工具 java、jdb、javac 和 javah 具有 -classpath 选项,在工具运行时它将取代缺省类路径或由 CLASSPATH 环境变量所指定的类路径。这是改变类路径设置的推荐方法,因为这样每个应用程序可具有它所需的类路径而又不会干扰其他应用程序。

运行时工具 java 和 jdb 还具有 -cp 选项。该选项是 -classpath 的缩写。 对于非常特殊的情况,java 和 javac 都具有开关,使得可改变它们使用的路径以查找它们自己的类库。但是,绝大多数用户从来都不会用到这些开关。

使用 CLASSPATH 环境变量 如前一节中所述,一般用户将想要使用 -classpath 命令行选项。本节将介绍如何设置 CLASSPATH 环境变量或清除以前安装遗留下的设置。

1.设置 CLASSPATH 在 DOS 提示符下,可用 set 命令修改 CLASSPATH 环境变量。其格式为: set CLASSPATH=path1;path2 ... 路径应该以指定驱动器的字母开头,例如 C:...。这样,在偶然切换到不同驱动器时仍可找到类(例如,如果路径项以 ... 开头,并且当前位于驱动器 D: 上,则所需的类将在 D: 而不是 C: 驱动器上找)。
 
2.清除 CLASSPATH 如果 CLASSPATH 环境变量被设置成不正确的值,或启动文件或脚本程序设置了不正确路径,则可通过使用下列命令清除 CLASSPATH: C:> set CLASSPATH= 该命令仅清除当前会话的 CLASSPATH。要确保在以后的会话中具有正确的 CLASSPATH 设置,则应该删除或修改启动设置。

更改启动设置 如果在系统启动时设置 CLASSPATH 变量,则查找它的位置取决于所使用的操作系统: 操作系统 方法 Windows 98 和 Windows 95 检查 autoexec.bat 文件中的 set 命令。 Windows NT 启动“控制面板”,选择“系统”,单击“环境”选项卡,并在“用户变量”部分中,检查 CLASSPATH 变量。 理解类路径和包名 Java 类被组织成包,而这些包被映射到文件系统中的目录。

但是与文件系统不同的是,无论何时指定包名,都应指定完整包名 -- 永远不要仅指定它的一部分。例如,java.awt.Button 的包名总是应指定为 java.awt。 例如,假定想要 Java 运行环境在包 utility.myapp 中查找名为 Cool.class 的类。如果该目录的路径为 C:javaMyClassesutilitymyapp,则应该将类路径设置成包含 C:javaMyClasses。 要运行该应用程序,可使用下述 JVM 命令: 

      C:> java -classpath C:\java\MyClasses\utility.myapp.Cool

当该应用程序运行时,JVM 使用类路径设置查找在 utility.myapp 包中定义的任何其他类。

注意:应在命令中指定完整包名。例如,设置类路径包含 C:\java\MyClasse\sutility 并使用命令 java myapp.Cool 是不可能的,因为这找不到该类。 (您可能想知道用什么定义类的包名。答案是:包名是类的一部分,并且不能修改,除非重新编译该类。)
 
注意:包规范机制一个有趣的结果是,属于相同包的多个文件实际上可存在于不同的目录中。对于每个类,包名都是相同的,但是每个文件的路径可从类路径中的不同目录开始。 文件夹和归档文件 当类存储在目录(文件夹)中时,例如 c:javaMyClassesutilitymyapp,则类路径项指向包含包名第一个元素的目录(在这里为 C:javaMyClasses,因为包名是 utility.myapp)。

但是当类存储在归档文件(.zip 或 .jar 文件)中时,类路径项则是该 .zip 或 .jar 文件的路径。例如,要使用位于 .jar 文件中的类库,则命令应该类似下述形式: java -classpath C:\java\MyClasses\myclasses.jar utility.myapp.Cool 多重指定 要在目录 C:\java\MyClasses 和 C:\java\OtherClasses 中查找类文件,则可将类路径设置为: java -classpath C:\java\MyClasses;C:\java\OtherClasses ... 注意两个路径之间用分号分隔。

指定次序 指定多个类路径项的次序是相当重要的。Java 解释器将按照目录在类路径变量中的次序在各个目录中查找类。在上例中,Java 解释器首先在目录 C:\java\MyClasses 中查找需要的类。只有当它在该目录中没有找到该类时,解释器才能到 C:\java\OtherClasses 目录中查找。

只有注册用户登录后才能发表评论。


网站导航: