Java 编译器如何在类路径未设置为 jdk 路径的情况下查找类文件



我试图深入了解Java编译。所以我把我的IDE收起来,开始使用MS-DOS命令行...

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

示例应用程序

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

这是示例.java源代码:

public class Sample 
{
    private String s = new String("Hello, world");
    public Sample(){
          System.out.println(s);
    }
}

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

promptSampleAppsrc>javac -d ..classes -sourcepath . packSample.java

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

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

所以我预计会出现编译错误,因为编译器无法找到java.lang.String类文件。

简短的回答是,编译器知道在哪里可以找到所有标准的Java SE库类,而无需您告诉它。

更长的答案是String类是在引导类路径上找到的。 这是由 javac 命令隐式设置的,以引用 JDK 安装中的相关 JAR。 javac 命令先搜索引导类路径,然后再在常规类路径上查找内容。

类路径变量不会按照您的想法执行操作。引用预言机文档:

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

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

基本上,由于java.lang.*是平台的一部分,并且与JDK/JRE一起交付,因此您不必告诉编译器在哪里查找它们。

最新更新