java命令和javac命令
在命令行中使用java来运行java程序,搜索类的过程分为以下3步:
1 搜索系统类,大部分都位于JAVA_HOME/jre/lib/rt.jar中
2 搜索扩展类,即那些位于JAVA_HOME/jre/lib/ext下的.jar文件中的类
3 搜索用户类路径 即环境变量CLASSPATH或者在命令行中由java指令的-cp选项指定,如果不指定-cp,那么CLASSPAT环境变量起作用;如果指定了-cp,那么只有-cp指定的类路径起作用。
注意:搜索系统类和扩展类是java虚拟机自动进行的,换句话说,即使环境变量CLASSPATH和java指令的-cp选项没有指定这两个路径,java虚拟机也会自动搜索。
?
下面以一个具体例子来说明,结合import语句,某一个类是如何被找到的。
假设在d:example\src文件夹下存放着java程序的源文件,文件层次结构如下:
d:\example\src\test\A.java
d:\example\src\test\B.java
这两个源文件的代码如下:
?
package test;import java.util.*;public class A {public static void main(String[] args) {Date date = new Date();B.say();}}
?
package test;public class B {public static void say() {System.out.println("Hello");}}
?
?
假设已经编译好了,在d:\example\classes文件下存放着要运行的类文件,其中A.class和B.class都位于test包中,文件层次结构
如下:
d:\example\classes\test\A.class
d:\example\classes\test\B.class
要运行这个程序,在命令行中切换到d:\example目录,即
?
?
?然后,键入如下命令:
?运行程序后就会输出Hello字符串。
其中类的搜寻过程如下:
1 为了找到A.class,虚拟机首先搜索系统类路径和扩展类路径但是找不到,接着搜索用户类路径,由于在java指令中使用了-cp选项,因此,虚拟机以当前工作目录(即命令行调用java指令时所在目录d:\example) + -cp指定的路径(classes) + 包名(test)构成的路径下搜索,d:\example\classes\test下搜索A.class,结果能够找到A.class(-cp所给的相对路径是相对于当前工作目录的,也可以指定绝对路径)
2 A.class引用了Date类,由于在使用Date类时没有指定Date类所在包,那么,虚拟机搜索时会结合所有的import语句,这里import语句java.util.*。
虚拟机在搜索系统类路径时,根据import语句,在JAVA_HOME/jre/lib/rt.jar/java/util文件夹下找到Date类
3 A.class引用了B.class,由于在使用B类时没有指定B类所在包,那么虚拟机搜索时会结合所有的import语句,这里import语句为java.util.*。但是虚拟机无论是结合import语句搜索系统类路径和扩展类路径,还是结合import语句搜索
用户类路径都找不到B.class,这时虚拟机会根据A.class所在的包(test)来构造路径搜索,在d:\example\classes\test中找到B.class文件。
注意:在第3步搜索B.class时,如果在A.java源文件中添加import test.*;语句也是可以的。
?
在命令行中用javac编译java源文件,javac既搜索类文件(过程和java指令一样),也搜索java源文件。以在命令行中编译d:\example\src\test\A.java
为例,只要键入以下命令即可:
?javac会进行如下搜索,
1 搜索源文件A.java,首先从当前工作目录(即运行javac指令时命令行所处的
目录,即d:\example),结合指定的源文件路径(src/test)搜索A.java,结果
在d:\example\src\test下发现A.java
2 搜索Date类,搜索Date类和java指令中搜索一样,结合import语句,最终
在系统类路径JAVA_HOME/jre/lib/rt.jar/java/util下找到Date.class
3 搜索B.java源文件,源文件的搜索路径由-sourcepath指定,具体搜索过程为,结合所有import语句搜索,即搜索d:\example\src\java\util,不能搜索到B.java,在结合A.java声明的包(test)进行搜索,即搜索d:\example\src\test,结果找到B.java(-sourcepath指定的相对路径也是相对于当前目录的,也可以指定绝对路径)
注意:
1 javac也可以有-cp选项,作用和java指令中的一样
2 如果javac指定了-cp没有指定-sourcepath,那么-cp既起到指定用户类路径的作用,也起到指定源文件搜索路径的作用;但是如果javac既指定了-cp,又指定了-sourcepaht,那么-cp只起到指定用户类路径的作用,-sourcepath只起到指定源文件搜索路径的作用
3 javac的-d选项指定生成的类文件存放位置,这里存放于(d:\example\classes)
?
?
?
?