回顾第一课中最简单的程序HelloWorld.java,我们首先在cmd命令行中进入HelloWorld.java所在的目录,接着使用javac将HelloWorld.java转换成HelloWorld.class,然后再使用java运行HelloWorld.class得到程序的结果。这个过程中发生了什么?
在这个过程中,JAVA的编译系统首先需要找到javac.exe、java.exe,是javac.exe将HelloWorld.java转换成HelloWorld.class,java.exe运行HelloWorld.class,而这两个exe文件在java的安装目录下。
那么JVM系统是怎么寻找.class文件的呢?
当在命令行输入java HelloWorld,java编译系统在找到了java.exe后,接着开始寻找HelloWorld.class文件,首先在当前目录下寻找,若未找到则去CLASSPATH所记录的路径下寻找HelloWorld.class文件,若仍为找到,则提示“找不到或无法加载主类”
Java 解释器运行CLASSPATH路径中.class文件的工作程序
-
首先,它找到环境变量CLASSPATH
将Java 或者具有 Java 解释能力的工具(如浏览器)安装到机器(如PC机)中时,通过操作系统设定的CLASSPATH。
CLASSPATH包含了一个或多个目录,它们作为一种特殊的“根”使用,从这里展开对.class文件的搜索。
从那个根开始,解释器会寻找包名,并将每个点号(句点)替换成一个斜杠,从而生成从CLASSPATH根开始的一个路径名(所以package foo.bar.baz 会变成foo\bar\baz或者foo/bar/baz;具体是正斜杠还是反斜杠由操作系统决定)。 -
随后将它们连接到一起,成为CLASSPATH内的各个条目(入口)。
以后搜索.class文件时,就可从这些地方开始查找与准备创建的类名对应的名字。此外,它也会搜索一些标准目录——这些目录与 Java 解释器驻留的地方有关。
特殊的地方
使用 JAR文件时要注意一个问题,必须将JAR文件的名字置于类路径里,而不仅仅是它所在的路径。
所以对一个名为tonls.jar 的 JAR文件来说,我们的类路径需要包括jar文件,如下为我自己的CLASSPATH,tools.jar和dt.jar的jar文件也包含在CLASSPATH中,而C:\Users\engineer\Desktop\JavaLearning只包含到文件夹:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:\Users\engineer\Desktop\JavaLearning;
理解了java编译系统寻找文件的机制,即可轻松理解package和import的设计,下节课介绍package和import