这是一个非常基本的问题,我无法找到令人满意的答案。
如果我的目录中有两个类TestCar.java
Car.java
,当我执行javac TestCar.java
时程序成功编译并导致为每个类创建两个.class文件。
我只要求编译器编译TestCar.java
,但不知怎的,编译器发现它还需要编译Car.java
文件。如果它是如何工作的,我应该能够要求javac
只编译我的程序的主类,它应该能够编译程序所依赖的所有.java文件。如果这是真的,为什么我们需要发出javac *.java
或javac dir1/*.java dir2/*java
之类的命令?
即使使用包,我们也应该能够通过执行
来编译所有文件javac com/project/MainClass.java
并且编译器应该能够编译程序所依赖的所有文件。那么为什么所有这些问题都是关于" how to compile multiple java files
" ?
答案 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中。
默认情况下,编译器将每个类文件放在与其源文件
相同的目录中