【问题标题】:How do you make javac recompile source files when their dependencies change?当它们的依赖关系发生变化时,如何让 javac 重新编译源文件?
【发布时间】:2011-02-23 10:57:24
【问题描述】:

在使用 javac 进行增量构建时,我的项目中似乎出现了运行时错误。是否支持这种类型的工作流程?比如A.java依赖B.java,修改B.java; javac会因为依赖改变而重新编译A.java吗?

现在我正在使用 javac ant build-task 进行编译:

    <javac destdir="${classes.dir}"
            srcdir="${src.dir}"
            source="${javac.version}"
            debug="${javac.debug}"
            deprecation="${javac.deprecation}"
            includeantruntime="build.sysclasspath=last">
        <classpath refid="compile.classpath" />
        <classpath refid="junit.classpath" />
    </javac>

【问题讨论】:

    标签: ant dependencies javac


    【解决方案1】:

    由于您使用的是 ant,请查看 depend 任务。

    【讨论】:

      【解决方案2】:

      javac 命令行编译器将编译命令行中给出的每个源文件,以及它们所依赖的所有文件,如果它们没有更新的类文件。

      ant javac 任务试图变得更聪明一点,以避免总是编译所有内容 - 它只重新编译那些已更改的文件(即比它们各自的类文件新)。这里没有注意可能某些类的依赖发生了变化,因此其他类也需要重新编译的情况。

      在我当前的项目中,每当我在测试中遇到问题时(当然在任何生产部署之前),我都会简单地执行ant clean,这会删除所有类文件。但正如 vanza 所说,有一个 depend 任务,其任务是查找并删除所有依赖于您更改的类的类 - 在您的 javac 任务之前运行它,您应该会很好。

      【讨论】:

        【解决方案3】:

        这取决于 B.java 中发生了什么变化。如果没有任何改变影响类呈现给 A 的方式,那么 javac 不需要重新编译 A.java 以使更改生效。

        也就是说,如果您看到您认为正在加载和运行旧代码的行为,我会更怀疑部署/打包过程而不是编译过程。 YMMV。

        【讨论】: