无法不想你,CLASSPATH,

     在Java编程中Classpath是最基本的知识,也是最常引出问题地方,近来重新拾起Java,不忍在这里总结一下

一,最基本的用法:

    Classpath是Java程序运行时,寻找相关的.class的路径,其实一个最简单的运行程序的入口class(真正的入口是这个class中的静态main方法)要找到其运行所需的类有几个地方搜索过程,首先搜寻java的内部路径(这个后面说明)还有运行环境的。xxxx/jre/lib/ext目录,再到Classpath中的所定义的路径。

   例如一个A。class (在包PA中)要调用B。class(在包PB中)的一个方法,A。class与B。class在同一目录下。以A为运行入口类,搜索路径如下java A:

   从操作系统中搜索A.class文件 找到后,运行环境调用A.class中的main方法,main方法中生成A类的实列,于是main要寻找A类,首先去java的内部路径中去寻找,缺省内部路径+PA 是找不到的。然后到xxx/jre/lib/ext/PA寻找,如果找不到就再到classpath + PA设定的路径中去找,如果找不到就会报异常。如果 找到就会成功生成A类的实列,如果A类的实便调用B类的实例,也会再去做一个搜索,搜索过程同上,只是其中的PA会换成了PB。

二,Jar包运行时的路径搜索。

   当把自己的程序进行jar打包发布时,路径相对的结构关系信息都会放到jar包中。但这个jar再设用本包内的其它包(package)中类时会自动从jar内部的根目录找到这些package中的类。这都容易理解,如果再调用其它的.class时,会首先从内部路径中搜索(此路径可以在运行时命令行(java -jar xbootstrap/a xxxx/  A.jar)中进行修改或增加新路径),

然后从xxx/jre/lib/ext/中搜索。再找不到,就要从A.jar中Menifest.mf文件设定的路径进行搜索此时可以用相对路径,相对于A.jar当前所在的目录.比如A.jar在aaa目录下(aaa/A.jar),A.jar中调用的加一个.class在xxxlib(aaa/xxxlib/)那么就要在menifest.mf文件中加入一行“Class-Path: xxxlib/"

   当所引用的类文件在第三方jar文件中时,也是一样,把上述的路径名换成jar文件名。如(java -jar -Xbootstrap/a xxx.jar A.jar)就是说运行A.jar,A.jar调用了xxx.jar中的类。  同样把xxx.jar放到xxx/jre/lib/ext/下面,A.jar可以直接调用。 而如果采用menifest.mf文件定义的方式就要采用"Class-Path: xxx.jar"那么发布时就要把xxx.jar放在A.jar相同的目录下,如果放到A.jar当前目录的子录yyy中,就要改成"Class-Path: yyy/xxx.jar"

 

三。对于任意目录下的第三方的.class与.jar 调用

   对于Java中没用如上述的那些与Classpath相关的地方如放到bootstrap,没放到jre/lib/ext,及也未在调用者jar的menifest.mf文件中指定的那些第三方.class与.jar使用有些特别的方法,使用class.forName是行不通的了,要使用

URLLoader这样的东西来加载了。这也是设计一个插件管理系统所常采用的方法。也是Eclipse自身插件所采用的技术。具体细节,明天再接着写。要干活了。

  

 

 

posted @ 2008-07-28 14:36  岁月无声  阅读(344)  评论(0编辑  收藏  举报