Java为什么不依赖常量会导致重新编译?
我有几个简单的类:Java为什么不依赖常量会导致重新编译?
// 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的值在编译时被替换为打印源。这很好,但我的问题是:为什么ant + javac不能重新编译当Consts改变时打印?这两者之间存在明显的编译时间依赖性。
(我刚刚有点所以很难通过这个问题,在我看来,这肯定是在的工具之一的错误。还是我失去了一些东西?)
回答:
已经四处张望了一下后,进一步看到Andy Turner的链接,我认为蚂蚁比我想像的要多得多。从javac task:
注:Apache Ant的使用只有源和类文件来 的名字查找需要重建的类。它不会扫描源代码,因此将不知道嵌套类, 被命名为与源文件不同的类,等等。请参阅 任务以进行依赖性检查,而不仅仅基于 存在/修改时间。
所提depend task甚至说,这明确:
这些限制的最明显的例子是,任务不能 什么时候恒定的基本数据类型 其他出口重新编译哪些类类被改变。例如, 定义的更改类似于
public final class常量{public final static boolean DEBUG = false; }
不会被其他类拾取。
这似乎完全描述我的情况。我认为这一切对我来说是一个教训:(a)不要使用蚂蚁,(b)如果你这样做,总是在构建之前进行清理。
以上是 Java为什么不依赖常量会导致重新编译? 的全部内容, 来源链接: utcz.com/qa/265542.html