当使用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>
答案 0 :(得分:8)
由于您使用的是ant,请查看depend任务。
答案 1 :(得分:5)
javac
命令行编译器将编译命令行上给出的每个源文件,以及它们所依赖的所有内容,如果它们没有更新的类文件。
ant javac
任务试图变得更聪明,以避免始终编译所有内容 - 它只重新编译那些已更改的文件(即比其各自的类文件更新)。这并没有注意可能某些类的依赖关系发生了变化的情况,因此其他类也需要重新编译。
在我当前的项目中,每当我遇到测试问题时(当然还有任何生产部署之前),我只会执行ant clean
,这会删除所有类文件。但正如vanza所说,有depend
任务,其任务是查找和删除依赖于已更改类的所有类 - 在javac
任务之前运行此任务并且您应该很好。
答案 2 :(得分:0)
这取决于B.java中的变化。如果没有任何改变影响类如何呈现给A,那么javac不需要重新编译A.java以使更改生效。
也就是说,如果你看到你认为旧代码被加载和运行的行为,我会比编译过程更加怀疑部署/打包过程。 YMMV。