我正在试图了解java编译的内幕。所以我放弃了我的IDE并开始使用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/,这篇文章让我了解了很多东西。文章作者说默认的类路径是当前的工作目录。但我不明白为什么我的源代码编译没有错误。有人可以向我解释一下吗?
答案 0 :(得分:6)
所以我期待编译错误,因为编译器无法找到java.lang.String类文件。
简短的回答是编译器知道在没有你告诉的情况下在哪里找到所有标准的Java SE库类。
更长的答案是在bootclasspath上找到String
类。这是由javac
命令设置的隐式,用于引用JDK安装中的相关JAR。 javac
命令在查找常规类路径上的内容之前搜索bootclasspath。
答案 1 :(得分:5)
classpath变量不符合您的想法。引用oracle文档:
CLASSPATH变量是一种告诉应用程序的方法,包括 JDK工具,在哪里查找用户类。 (属于的类别 JRE,JDK平台和扩展应该通过其他来定义 意味着,例如引导类路径或扩展目录。)
来源:http://docs.oracle.com/javase/tutorial/essential/environment/paths.html
基本上,由于java.lang.*
是平台的一部分并随JDK / JRE一起提供,因此不必告诉编译器在哪里查找它们。