为什么Java对常量的依赖不会导致重新编译?

时间:2016-11-02 10:19:32

标签: java ant

我有几个简单的课程:

// 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发生变化时不重新编译打印?两者之间有明确的编译时依赖关系。

(我刚刚通过这个问题得到了所以很难,在我看来它肯定是其中一个工具中的一个错误。或者我错过了什么?)

1 个答案:

答案 0 :(得分:4)

在看到安迪特纳的链接之后再看了一下,我觉得蚂蚁比我想象的要多得多。来自javac task

  

注意:Apache Ant仅使用源文件和类文件的名称   找到需要重建的类。它不会扫描源和   因此将不了解嵌套类,类   命名与源文件不同,依此类推。见   基于异常检查的依赖性检查任务   存在/修改时间。

上述depend task甚至明确地说明了这一点:

  

这些限制最明显的例子是任务不能   告诉哪些类在常量基本数据类型时重新编译   由其他类导出的更改。例如,改变了   像

这样的定义      

public final class Constants {public final static boolean DEBUG = false; }

     其他课程不会选择

这似乎完全描述了我的情况。我认为这一切对我来说的教训是:(a)不要使用蚂蚁,(b)如果你这样做,在构建前总是要清洁。