classPath的理解

对于classpath作用的解释在《Thinking in Java》中有如下解释:
   Java 解释器的工作程序如下:
  首先,它找到环境变量CLASSPATH(将Java 或者具有Java 解释能力的工具——如浏览器——安装到机器中时,通过操作系统进行设定)。CLASSPATH 包含了一个或多个目录,它们作为一种特殊的“根”使用,从这里展开对.class 文件的搜索。从那个根开始,解释器会寻找包名,并将每个点号(句点)替换成一个斜杠,从而生成从CLASSPATH 根开始的一个路径名(所以package foo.bar.baz 会变成foo\bar\baz 或者foo/bar/baz;具体是正斜杠还是反斜杠由操作系统决定)。随后将它们连接到一起,成为CLASSPATH 内的各个条目(入口)。以后搜索.class 文件时,就可从这些地方开始查找与准备创建的类名对应的名字。此外,它也会搜索一些标准目录——这些目录与Java 解释器驻留的地方有关。
classpath是什么? 它的作用是什么?
    classpath是javac编译器的一个环境变量。
    它的作用是指定类搜索路径,它与import、package关键字有关.
    当你写下improt java.util.*时,编译器面对import关键字时,就知道你要引入java.util这个package中的类;但是编译器如何知道你把这个package放在哪里了呢?所以你首先得告诉编译器这个package的所在位置;如何告诉它呢?就是设置CLASSPATH啦 :) 如果java.util这个package在c:\jdk\ 目录下,你得把c:\jdk\这个路径设置到CLASSPATH中去!当编译器面对import java.util.*这个语句时,它先会查找CLASSPATH所指定的目录,并检视子目录java\util是否存在,然后找出名称吻合的已编译文件(.class文件)。如果没有找到就会报错!
    CLASSPATH有点像c\c++编译器中的INCLUDE路径的设置哦,是不是?当c\c++编译器遇到include <iostream>这样的语句,它是如何运作的?哦,其实道理都差不多!搜索INCLUDE路径,检视文件!
    当你自己开发一个package时,然后想要用这个package中的类;自然,你也得把这个package所在的目录设置到CLASSPATH中去!
CLASSPATH的设定,对JAVA的初学者而言是一件棘手的事。所以Sun让JAVA2的JDK更聪明一些。你会发现,在你安装之后,即使完全没有设定CLASSPATH,你仍然能够编译基本的JAVA程序,并且加以执行
    可以看出,CLASSPATH 里能包含大量备用的搜索路径。然而,使用JAR 文件时要注意一个问题:必须将JAR文件的名字置于类路径里,而不仅仅是它所在的路径。所以对一个名为grape.jar 的JAR 文件来说,我们的类路径需要包括:
   CLASSPATH=.;D:\JAVA \LIB;C:\flavors\grape.jar

   个人理解说明:其实从上面可以看出,如果你用记事本来写java程序(在Window下),并用cmd命令窗口中输入javac,java命令,如果你的代码中用到了其它的jar或者你自己的写的类,但又和你的主程序没在一个包下,这时你就要在classpath中设置你要用到的jar或者自己写的类的路径,让Java在编译器可以找到你要用的东西,如上面例子所示。 在我们用一些工具时,如eclipse中,我们可以把一些Jar包什么的添加进来,然后搜索路径的事工具帮我们做了,所以不用在手动加进去。所以在eclipse实际的开发中,没有用到系统配置的classpath,而是自己会生成一个.classpath的文件;只有用cmd javac 编译时会用到系统的classpath(这也可以改变,见下)。
   classpath=c:\test就表示执行运行命令时去c:\test文件夹去找需要被执行的class文件
   在java5之前该路径是不能指定当前路径的,除非这样设置:classpath=.;c:\test,就表示先在当前目录找class文件,要是没找到就到c:\test去找;(当一个变量有多个值时,多个值之间是有英文的分号隔开),设置从当前所在目录查找(java1.5后默认):set classpath=.
CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPATH来寻找类的.class文件。我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。
 javac -c  路径 (可以指定class文件存放目录)
 java -cp  路径  (可以指定要执行的class目录)
 
  
   (1).何时需要使用-classpath:当你要编译或执行的类引用了其它的类,但被引用类的.class文件不在当前目录下时,就需要通过-classpath来引入类
   (2).何时需要指定路径:当你要编译的类所在的目录和你执行javac命令的目录不是同一个目录时,就需要指定源文件的路径(CLASSPATH是用来指定.class路径的,不是用来指定.java文件的路径的)
eg:
   比方有一个Application用到了java.lang.String和com.shinechina.MyClass(我自己写的)这两个类。

版本1:

   
   
  1. package com.shinechina;
  2. public class MyClass
  3. {
  4. public static void main(String args[])
  5. {
  6. String str = “版本1: hello, welcome to chinaasp java 技术”;
  7. System.out.println(str);
  8. }
  9. }
版本2:

   
   
  1. package com.shinechina;
  2. public class MyClass{
  3. public static void main(String args[]){
  4. String str = "版本2:hello,welcome to chinaasp java 技术";
  5. System.out.println(str);
  6. }
  7. }
   现在我要运行它了

  java com.shinechina.MyClass

   现在问题来了

 Java怎么知道到何处找呢, 他到底该怎么办

 假定版本一在 c:\mylib\com\shinechina\MyClass.java

 假定版本二在 d:\mylib\com\shinechina\MyClass.java

 注意:不要忘了编译成class文件吆, java文件是不能执行的

   cd c:\mylib\com\shinechina
   javac *.java
   cd d:\mylib\com\shinechina
   javac *.java


 有了:

 他先到机器的CLASSPATH去找,假设是windows系统 c:\mylib;d:\mylib;d:\jdk1.2.2\lib\rt.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\com\shinechina\MyClass.java

  编译后c:\mylib\com\shinechina\MyClass.class

  怎么指定classpath呢

  常见毛病

   1、c:\mylib\com\shinechina\

   2、c:\mylib\com\

  正确

   1、c:\mylib\

   2、c:\mylib
 
  
classpath的重要性
     用eclipse开发项目时,对每个项目都需要配置classpath,具体怎么配只需要在项目上鼠标右键build path.然后一步步操作,你配完之后,打开你的项目所在的workpace,打开你的项目文件,里面有一个.classpath文件,你打开这个文件之后就会看到你之前在eclipse中build path的结果。比如我在项目中加入了一个我先前自己配置的User Library,名字叫做MysqlJDBCDriver ,加完之后,在我的项目的.classpath文件中多出了一条<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/MysqlJDBCDriver"/>
    我认为项目是独立于电脑环境变量的classpath的,每一个项目都需要它特定的classpath,所以在eclipse开发的时候每一个项目都会有一个.classpath文件(ps:为什么每个项目需要自己的classpath?因为每个项目都需要引入自己特定的类库,而电脑环境变量的classpath是通用的,你不可能让你的所有项目都只是使用电脑环境变量classpath中设置的这几个类库吧)
   我觉得.classpath独立于电脑的classpath还有一个重要的原因:当你最后做成jar包提供给用户的时候,用户想要运行这个jar,你不能奢求用户的电脑中的classpath有你当前引用包的路径,因为用户的系统是干净的,所以我们需要把我们需要引用的包build到.classpath中
            </div>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值