我有几个简单的课程:
// src/Consts.java
public class Consts
{
public static final int A = 100;
public static final int B = 101;
}
和
// src/Print.java
public class Print
{
public static void main(String[] args)
{
System.out.println("A: " + Consts.A + " B: " + Consts.B);
}
}
我有一个简单的ant构建文件:
<project name="Test" default="compile" basedir=".">
<!-- set global properties for this build -->
<property name="src" location="src"/>
<property name="build" location="build"/>
<target name="compile">
<mkdir dir="${build}"/>
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}" debug="on" />
</target>
<target name="clean">
<delete dir="${build}"/>
</target>
</project>
我运行ant
,然后运行java -cp build Print
,我得到了我期望的输出A: 100, B: 101
。精细。然后我编辑Consts.java来设置A = 200和B = 201并重新运行ant
。它说“编译1个源文件”,即Consts.java(通过查看类文件的时间戳确认)。然后我重新运行java -cp build Print
并打印A: 100, B: 101
。至少可以说是出乎意料的。
谷歌搜索表明,Consts中的值在编译时被替换为Print源。哪个没问题,但我的问题是:为什么ant + javac在Consts发生变化时不重新编译打印?两者之间有明确的编译时依赖关系。
(我刚刚通过这个问题得到了所以很难,在我看来它肯定是其中一个工具中的一个错误。或者我错过了什么?)
答案 0 :(得分:4)
在看到安迪特纳的链接之后再看了一下,我觉得蚂蚁比我想象的要多得多。来自javac task:
注意:Apache Ant仅使用源文件和类文件的名称 找到需要重建的类。它不会扫描源和 因此将不了解嵌套类,类 命名与源文件不同,依此类推。见 基于异常检查的依赖性检查任务 存在/修改时间。
上述depend task甚至明确地说明了这一点:
这些限制最明显的例子是任务不能 告诉哪些类在常量基本数据类型时重新编译 由其他类导出的更改。例如,改变了 像
这样的定义public final class Constants {public final static boolean DEBUG = false; }
其他课程不会选择。
这似乎完全描述了我的情况。我认为这一切对我来说的教训是:(a)不要使用蚂蚁,(b)如果你这样做,在构建前总是要清洁。