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?)
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.