java类路径classpath
java编译器编译.java文件和java虚拟机执行.class文件时的路径和写法不一样。
在没有设置任何classpath环境变量的情况下,javac可以编译全路径的.java文件。例如:
javac d:\myjava\HelloWorld.java
编译后,在.java同路径目录下生成class文件。
默认java虚拟机要从classpath环境变量的路径中搜索class文件去执行,对于java虚拟机来说,这不是类文件,而是类。它只有类路径,而没有文件系统路径。而classpath环境变量正是为java虚拟机提供搜索类路径的环境。注意,虚拟机不会递归搜索classpath定义的路径。
也就是说,上面的java文件可以正确编译,但却不能执行。但如果将classpath设置为".;d:\myjava\",则java虚拟机将先从当前路径搜索,再从d:\myjava下搜索class文件。
于是上面的HelloWorld.java编译后,可以直接执行:
java HelloWorld
或者切换到d:\myjava目录下,执行java HelloWorld
。
总之,要明确的是javac编译器搜索的是文件路径,和环境变量classpath无关。而java虚拟机搜索的是类文件,严格地说是类,搜索路径由classpath决定,且有先后顺序。