关于classpath变量与包导入问题

来源:互联网 发布:千图网软件下载 编辑:程序博客网 时间:2024/06/06 00:57
说到这里,你应该明白原来 CLASSPATH像系统里面的PATH一样,都是一种路 径系统里的PATH的路径是提供系统里面文件的检索, CLASSPATH是在Java虚拟机 工作的时候提供对CLASS的检索。

既然已经决定创造出一个CLASSPATH出来,那么该怎么实现这个CLASSPATH呢?当然还是不能脱离具体的操作系统,巧妇难为无米之炊,我们建不出空中楼阁。 PATH挺像我们需要的 CLASSPATH的,那么我们就把PATH加工一下或者改造一下, 当作我们需要的东西来用吧。事实上也是这么做的。

于是我们在系统的环境变量里面添加一个新的变量叫 CLASSPATH。他的描述方法用PATH的描述方法:



.;D:/classes/;D:/j2sdk1.4.2b/lib/dt.jar;D:/j2sdk1.4.2b/lib/tools.jar




可以看到,新的变量 CLASSPATH使用的系统的路径表示的(例如D:/classes/ 就是一个系统的路径),但是不能用环境环境变量PATH,所以不能写成:



%Path%;D:/classes/;D:/j2sdk1.4.2b/lib/dt.jar;D:/j2sdk1.4.2b/lib/tools.jar




或者



$Path;D:/classes/;D:/j2sdk1.4.2b/lib/dt.jar;D:/j2sdk1.4.2b/lib/tools.jar  




这样当jvm想要调用Java文件(class文件)的时候,不能通过PATH寻找,只能 从CLASSPATH寻找了。

让我们看一个例子:



D:/JavaTest>javac HelloWorld.java  




这一步的执行过程是:

1.系统发现启动的程序是javac,于是开始寻找javac.exe。 寻找的次序按照上篇所述寻找notepad.exe的顺序雷同

2.找到之后,运行javac.exe,附加参数HelloWorld.java

3.javac编译HelloWorld.java -> HelloWorld.class
如果HelloWorld.java中有其他类库(类库就是分类整理好的一堆class 文件)的引用,例如:



import java.io.*;
import com.hdpan.util.*;




对于标准类库的引用,像上面的"java.io.*",可以直接使用,也就是说它 不需要显示的放在系统的环境变量CLASSPATH中。

而对于非标准类库,像"com.hdpan.util.*",javac怎么来找到它呢? 上面说了,它是通过系统的环境变量CLASSPATH来找:让我们再回顾一下我 们的CLASSPATH是如何设定的:



.;D:/classes/;D:/j2sdk1.4.2b/lib/dt.jar;D:/j2sdk1.4.2b/lib/tools.jar




然后再看看当前的目录结构:

首先找到D:/JavaTest/HelloWorld.java,这个是我们正在编译的文件,接 下来,我们来看看javac是怎么来寻找net.eastdawn.util.*的:

发现是非标准类库,开始搜索CLASSPATH,第一个CLASSPATH是".",也就是当前目录,当前目录有一个net文件夹,然后eastdawn,可是eastdawn文件夹下面没有util文件夹,于是第一个CLASSPATH搜索失败。然后搜索第二个CLASSPATH "D:/classes/",果然再此发现了net/eastdawn/util/,于是这里编译通过。

至此,D:/JavaTest>javac HelloWorld.java 执行完毕。

现在也应该明白为什么在CLASSPATH的前面会有一个 "."了吧?他就是为了优先 搜索当前目录下的class。

运行完javac之后,当前目录多一个文件:HelloWorld.class,运行它:



D:/JavaTest>java HelloWorld  




(注意:是java HelloWorld,而不是java HelloWorld.class)

这里用到了java命令,所以启动一个jvm(jvm是什么?看前面的文章吧,:)), 开始搜索CLASSPATH,首先按照"."搜索,在当前目录找到了HelloWorld.class, 于是运行!

现在你明白了为什么许多人别写了HelloWorld却在运行的时候出现这个了吧:



Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld  




你想对了,就是因为jre不能根据CLASSPATH来找到HelloWorld.class,哪怕HelloWorld.class就在当前目录,当时环境变量的CLASSPATH里没有 "."这个设定,同样是找不到!哈哈,java怎么这么笨啊~,是很笨的,那么,聪明的我们 就不要再犯这样的错误喽~。

然后呢,一大堆的问题你都应该可以解决了,比如频繁出现的
NoClassDefFoundError、class not found、.....


原创粉丝点击