我们在系统的环境变量里面添加一个新的变量叫 CLASSPATH。他的描述方法用PATH的描述方法:
可以看到,新的变量 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。
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
然后再看看当前的目录结构:
JAVA中classpath的了解[归纳] - 无风 - 听雨无风
首先找到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却在运行的时候出现这个了吧:
你想对了,就是因为jre不能根据CLASSPATH来找到HelloWorld.class, 哪怕HelloWorld.class就在当前目录,当时环境变量的CLASSPATH里没有 "."这个 设定,同样是找不到!
在web工程下,CLASSPATH的具体目录以及解释是:
classpath是指 WEB-INF文件夹下的classes目录
classes含义:
1.存放各种资源配置文件 eg.init.properties log4j.properties struts.xml
2.存放模板文件 eg.actionerror.ftl
3.存放class文件 对应的是项目开发时的src目录编译文件
总结:这是一个定位资源的入口
可以看到,新的变量 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。
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
然后再看看当前的目录结构:
JAVA中classpath的了解[归纳] - 无风 - 听雨无风
首先找到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却在运行的时候出现这个了吧:
你想对了,就是因为jre不能根据CLASSPATH来找到HelloWorld.class, 哪怕HelloWorld.class就在当前目录,当时环境变量的CLASSPATH里没有 "."这个 设定,同样是找不到!
在web工程下,CLASSPATH的具体目录以及解释是:
classpath是指 WEB-INF文件夹下的classes目录
classes含义:
1.存放各种资源配置文件 eg.init.properties log4j.properties struts.xml
2.存放模板文件 eg.actionerror.ftl
3.存放class文件 对应的是项目开发时的src目录编译文件
总结:这是一个定位资源的入口