我有几个简单的类:
// 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
。至少可以说,这是出乎意料的。
google提示const中的值在编译时被替换到Print源代码中。这很好,但我的问题是:为什么ant+javac不重新编译Print时,const改变?两者之间存在明显的编译时依赖关系。
(我刚刚被这个问题弄得有点所以很难,在我看来这肯定是其中一个工具的错误。)还是我错过了什么?)
在看了Andy Turner的链接后,我进一步看了一下周围,我觉得蚂蚁比我想象的要笨得多。从javac任务:
注意:Apache Ant只使用源文件和类文件的名称来找到需要重新构建的类。它不会扫描源和因此,将不了解嵌套类,类命名与源文件不同,等等。看到依赖项检查的任务存在/修改时间。
上面提到的depend任务甚至明确地说:
这些限制最明显的例子是任务不能告诉当使用常量基本数据类型时要重新编译哪些类其他类导出的更改。例如,更改诸如
之类的定义public final class Constants {public final static boolean DEBUG=false;}
将不会被其他班级拾取。
这似乎正好描述了我的情况。我认为这一切给我的教训是:(a)不要使用ant, (b)如果你这样做,总是在构建之前清理。