【问题标题】:Why do we need to ask javac to compile multiple source files?为什么要让javac编译多个源文件?
【发布时间】:2015-04-17 09:25:10
【问题描述】:

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

如果我的目录中有两个类TestCar.javaCar.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”的问题呢?

【问题讨论】:

    标签: java compilation javac


    【解决方案1】:

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

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

    【讨论】:

    • 实际上编译器非常非常聪明——它只是在一些不需要担心的东西上很愚蠢,比如依赖关系和可以由你提到的工具处理的东西。
    • 如果我的程序不使用反射,我应该能够像我提到的那样编译(只编译主类)?
    • @DesirePRG 不。我建议使用 maven 或 gradle 构建系统。
    【解决方案2】:

    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 中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      相关资源
      最近更新 更多