Warum führt die Java-Abhängigkeit von einer Konstante nicht zur Neukompilierung?

9

Ich habe ein paar einfache Klassen:

%Vor%

Und:

%Vor%

Ich habe eine einfache Ameisen-Build-Datei:

%Vor%

Ich starte ant , dann starte java -cp build Print , ich bekomme die erwartete Ausgabe, A: 100, B: 101 . Fein. Dann bearbeite ich Consts.java, um A = 200 und B = 201 zu setzen und ant erneut auszuführen. Es heißt "Compiling 1 source file", was "Consts.java" ist (bestätigt durch das Betrachten von Zeitstempeln von Klassendateien). Dann führe ich java -cp build Print erneut aus und drucke A: 100, B: 101 . Das war unerwartet, um es gelinde auszudrücken.

Googling schlägt vor, dass die Werte von "Consts" zum Zeitpunkt der Kompilierung in die Druckquelle eingefügt werden. Das ist in Ordnung, aber meine Frage lautet dann: Warum hat ant + javac Print nicht neu kompiliert, wenn sich die Constants geändert haben? Zwischen den beiden besteht eine klare Kompilierungszeitabhängigkeit.

(Ich habe gerade ein bisschen so hart von diesem Problem und es scheint mir, es ist sicherlich ein Fehler in einem der Tools. Oder fehle ich etwas?)

    
Neil Brown 02.11.2016, 10:19
quelle

1 Antwort

4

Nachdem ich Andy Turners Link gesehen habe, habe ich mich ein wenig weiter umgeschaut. Ich denke, dass ant einfach viel dümmer ist, als ich dachte. Aus der Java-Aufgabe :

  

Hinweis: Apache Ant verwendet nur die Namen der Quell- und Klassendateien für   finde die Klassen, die eine Neuerstellung benötigen. Es wird nicht die Quelle und gescannt   daher wird es keine Kenntnisse über verschachtelte Klassen, also Klassen, geben   haben einen anderen Namen als die Quelldatei und so weiter. Siehe die   Aufgabe für die Abhängigkeitsprüfung, die auf anderem als nur basiert   Existenz / Modifikationszeiten.

Die erwähnte abhängige Aufgabe sagt dies sogar ausdrücklich:

  

Das offensichtlichste Beispiel für diese Einschränkungen ist, dass die Aufgabe dies nicht kann   Ermitteln Sie, welche Klassen bei einem konstanten primitiven Datentyp neu kompiliert werden   von anderen Klassen exportiert wird geändert. Zum Beispiel eine Änderung in der   Definition von etwas wie

     

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

     

wird nicht von anderen Klassen übernommen.

Was meinen Fall genau zu beschreiben scheint. Ich denke, die Lektion für all das ist für mich: (a) nimm keine Ameise, (b) wenn du das tust, reinige immer vor einem Build.

    
Neil Brown 02.11.2016 10:46
quelle

Tags und Links