java编译器如何查找类文件而classpath未设置为jdk路径?

Pat*_* B. 7 java dos javac classpath

我试图了解一下java编译的内幕.所以我放弃了我的IDE并开始使用MS-DOS命令行...

我创建了一个简单的项目,如下面的树所述:

SampleApp

|____**src**

       |_____pack
               |______Sample.java
|____**classes**
Run Code Online (Sandbox Code Playgroud)

这是Sample.java源代码:

public class Sample 
{

    private String s = new String("Hello, world");

    public Sample(){
          System.out.println(s);
    }
}
Run Code Online (Sandbox Code Playgroud)

我只想编译这个类,所以我使用了javac命令:

prompt\SampleApp\src>javac -d ..\classes -sourcepath . pack\Sample.java
Run Code Online (Sandbox Code Playgroud)

一切正常,但我没想到,因为我CLASSPATH在编译Sample.java文件之前删除了我的环境变量.所以我期待编译器错误,因为编译器无法找到java.lang.String类文件.

我读了这篇文章http://www.ibm.com/developerworks/java/library/j-classpath-windows/,它帮助我理解了很多东西.文章作者说默认的类路径是当前的工作目录.但我不明白为什么我的源代码编译没有错误.有人可以向我解释一下吗?

Ste*_*n C 6

所以我期待编译错误,因为编译器无法找到java.lang.String类文件.

简短的回答是编译器知道在哪里找到所有标准Java SE库类而不告诉它.

更长的答案是String在bootclasspath上找到了类.这是由命令隐式设置的,javac用于引用JDK安装中的相关JAR.该javac命令在查找常规类路径上的内容之前搜索bootclasspath.


Voo*_*Voo 5

classpath变量不符合您的想法.引用oracle文档:

CLASSPATH变量是告诉应用程序(包括JDK工具)查找用户类的一种方法.(属于JRE,JDK平台和扩展的类应该通过其他方式定义,例如引导类路径或扩展目录.)

资料来源:http://docs.oracle.com/javase/tutorial/essential/environment/paths.html

基本上,因为它java.lang.*是平台的一部分并随JDK/JRE一起提供,所以编译器不必告诉您在哪里查找它们.