为什么我们需要让javac编译多个源文件?

时间:2015-04-17 09:25:10

标签: java compilation javac

这是一个非常基本的问题,我无法找到令人满意的答案。

如果我的目录中有两个类TestCar.java Car.java,当我执行javac TestCar.java时程序成功编译并导致为每个类创建两个.class文件。

我只要求编译器编译TestCar.java,但不知怎的,编译器发现它还需要编译Car.java文件。如果它是如何工作的,我应该能够要求javac只编译我的程序的主类,它应该能够编译程序所依赖的所有.java文件。如果这是真的,为什么我们需要发出javac *.javajavac dir1/*.java dir2/*java之类的命令?

即使使用包,我们也应该能够通过执行

来编译所有文件
javac com/project/MainClass.java 

并且编译器应该能够编译程序所依赖的所有文件。那么为什么所有这些问题都是关于" how to compile multiple java files" ?

2 个答案:

答案 0 :(得分:2)

编译器并不那么聪明。例如,它无法通过反射知道您使用的类,因此它仅适用于最基本的情况。

这就是为什么我们构建像ant,maven或gradle这样的系统来处理编译而不必手动输入所有需要的类。

答案 1 :(得分:1)

javac工具读取用Java编程语言编写的类和接口定义,并将它们编译为字节码类文件。它还可以处理Java源文件和类中的注释。

有两种方法可以将源代码文件名传递给javac:

对于少量源文件,只需在命令行中列出文件名即可。 对于大量源文件,请在文件中列出文件名,以空格或换行符分隔。然后在javac命令行上使用列表文件名,前面加上@字符。 源代码文件名必须具有.java后缀,类文件名必须具有.class后缀,源文件和类文件都必须具有标识该类的根名称。例如,一个名为MyClass的类将写在一个名为MyClass.java的源文件中,并编译成一个名为MyClass.class的字节码类文件。

内部类定义会生成其他类文件。这些类文件具有组合内部和外部类名的名称,例如MyClass $ MyInnerClass.class。

您应该将源文件排列在反映其包树的目录树中。例如,如果将所有源文件保存在C:\ workspace中,则com.mysoft.mypack.MyClass的源代码应位于C:\ workspace \ com \ mysoft \ mypack \ MyClass.java中。

默认情况下,编译器将每个类文件放在与其源文件

相同的目录中
相关问题