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

为什么我们需要要求javac编译多个源文件?,java,compilation,javac,Java,Compilation,Javac,这是一个非常基本的问题,我还无法找到令人满意的答案 如果我的目录中有两个类TestCar.javaCar.java,当我执行javac TestCar.java时,程序成功编译,并为每个类创建两个.class文件 我只要求编译器编译TestCar.java,但不知怎的,编译器发现它也需要编译Car.java文件。如果它是这样工作的,我应该能够要求javac只编译我程序的主类,它应该能够编译程序所依赖的所有.java文件。如果这是真的,为什么我们需要发出javac*.java或javac dir1

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

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

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

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

javac com/project/MainClass.java 

编译器应该能够编译程序所依赖的所有文件。那么为什么所有这些问题都是关于“
如何编译多个java文件”
”?

编译器不是那么聪明。例如,它不知道反射使用的是什么类,所以它只适用于最基本的情况


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

编译器没有那么聪明。例如,它不知道反射使用的是什么类,所以它只适用于最基本的情况


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

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中


默认情况下,编译器将每个类文件与其源文件放在同一目录中,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中


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

实际上,编译器非常聪明-它只是对一些不需要担心的东西,比如依赖项和可以由您提到的工具处理的东西不感兴趣。如果我的程序不使用反射,我应该能够像我提到的那样编译(只编译主类)?@DesirePG没有。我建议找maven或gradle来构建系统。事实上,编译器非常聪明-它只是对一些东西不太了解,不需要担心依赖性和你提到的工具可以处理的东西。如果我的程序不使用反射,我应该能够像我提到的那样编译(仅编译主类)?@DesirePG否。我建议查看maven或gradle以获得构建系统。