2016-11-02 116 views
9

我有幾個簡單的類: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改變時打印?這兩者之間存在明顯的編譯時間依賴性。

(我剛剛有點所以很難通過這個問題,在我看來,這肯定是在的工具之一的錯誤。還是我失去了一些東西?)

+1

相關:https://netbeans.org/bugzilla/show_bug.cgi?id=75236 –

+1

@AndyTurner我認爲這個鏈接主要是說:螞蟻依賴性檢查不太好。這是否重要? – GhostCat

回答

4

已經四處張望了一下後,進一步看到Andy Turner的鏈接,我認爲螞蟻比我想像的要多得多。從javac task

注:Apache Ant的使用只有源和類文件來 的名字查找需要重建的類。它不會掃描源代碼,因此將不知道嵌套類, 被命名爲與源文件不同的類,等等。請參閱 任務以進行依賴性檢查,而不僅僅基於 存在/修改時間。

所提depend task甚至說,這明確:

這些限制的最明顯的例子是,任務不能 什麼時候恆定的基本數據類型 其他出口重新編譯哪些類類被改變。例如, 定義的更改類似於

public final class常量{public final static boolean DEBUG = false; }

不會被其他類拾取。

這似乎完全描述我的情況。我認爲這一切對我來說是一個教訓:(a)不要使用螞蟻,(b)如果你這樣做,總是在構建之前進行清理。

相關問題