当依赖项发生变化时,如何让javac重新编译源代码文件?

时间:2011-02-23 02:03:03

标签: ant dependencies javac

当使用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>

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:0)

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

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