Java编译器如何找到类文件,即使classpath未设置为jdk路径?

7

我正在尝试深入了解 Java 编译。因此,我放下我的集成开发环境并开始使用 MS-DOS 命令行……

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

SampleApp

|____**src**

       |_____pack
               |______Sample.java
|____**classes**

这是Sample.java的源代码:

public class Sample 
{

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

    public Sample(){
          System.out.println(s);
    }
}

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

prompt\SampleApp\src>javac -d ..\classes -sourcepath . pack\Sample.java

所有都运作良好,但我没有预料到这一点,因为在编译Sample.java文件之前,我删除了我的CLASSPATH环境变量。所以我期望会有编译错误,因为编译器无法找到java.lang.String类文件。
我阅读了这篇文章http://www.ibm.com/developerworks/java/library/j-classpath-windows/ ,它帮助我理解了很多事情。文章作者说默认的classpath是当前工作目录,但我不明白为什么我的源代码能够编译通过而没有错误。请问有人能解释一下吗?
2个回答

6
所以我预计会因为编译器找不到java.lang.String类文件而出现编译错误。
简短的答案是,编译器知道在没有你告诉它的情况下如何找到所有标准的Java SE库类。
更长的答案是,String类可以在bootclasspath中被找到。这是由javac命令隐含设置的,以引用JDK安装中相关的JAR文件。javac命令在查找常规类路径上的内容之前先搜索bootclasspath。

谢谢您的回复。它真的帮了我很多!我会继续寻找有关 bootclasspath 的更多信息。 - Patrick B.

5
类路径变量并不像你想象的那样。引用Oracle文档的说法:
“CLASSPATH变量是告诉应用程序(包括JDK工具)在哪里查找用户类的一种方式。(作为JRE、JDK平台和扩展的一部分的类应该通过其他方式定义,例如引导类路径或扩展目录。)”
来源:http://docs.oracle.com/javase/tutorial/essential/environment/paths.html 基本上,由于java.lang.*是平台的一部分,并随JDK/JRE一起提供,编译器不需要你告诉它在哪里查找它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接