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

回到顶部