java中classpath详细[通俗易懂]

java中classpath详细[通俗易懂]对于classpath作用的解释在《ThinkinginJava》中有如下解释:Java解释器的工作程序如下:  首先,它找到环境变量CLASSPATH(将Java或者具有Java解释能力的工具——如浏览器——安装到机器中时,通过操作系统进行设定)。CLASSPATH包含了一个或多个目录,它们作为一种特殊的“根”使用,从这里展开对.class文件的搜索。从那个根开始,解释器会

大家好,欢迎来到IT知识分享网。

对于classpath作用的解释在《Thinking in Java》中有如下解释:

IT知识分享网

IT知识分享网   Java 解释器的工作程序如下:
  首先,它找到环境变量CLASSPATH(将Java 或者具有Java 解释能力的工具——如浏览器——安装到机器中时,通过操作系统进行设定)。CLASSPATH 包含了一个或多个目录,它们作为一种特殊的“根”使用,从这里展开对.class 文件的搜索。从那个根开始,解释器会寻找包名,并将每个点号(句点)替换成一个斜杠,从而生成从CLASSPATH 根开始的一个路径名(所以package foo.bar.baz 会变成foo\bar\baz 或者foo/bar/baz;具体是正斜杠还是反斜杠由操作系统决定)。随后将它们连接到一起,成为CLASSPATH 内的各个条目(入口)。以后搜索.class 文件时,就可从这些地方开始查找与准备创建的类名对应的名字。此外,它也会搜索一些标准目录——这些目录与Java 解释器驻留的地方有关。
IT知识分享网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:
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 现在问题来了  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中

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/11103.html

(0)
上一篇 2023-02-24 09:00
下一篇 2023-02-26 18:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信