Der Ant-Task “copy” kopiert eine Datei oder eine Sammlung von Dateien. So einfach, so gut. Der Task ist mit den Filesets sehr komplex einsetzbar. Auch toll.

Allerdings ist es nicht möglich, Dateien von einem Ort A nach Ort B zu kopieren, ohne dass das Ziel überschrieben wird – egal ob die Quelldatei neuer als das Ziel ist. Das Attribut “overwrite” gilt nämlich nur für den Fall, wenn die Quelle älter ist. Ähm, wie bescheuert ist das?

Das ursächliche Problem ist, dass ein Maven-Plugin mehrmals ausgeführt wird (lässt sich akut nicht verhindern). Das erste Mal ist der richtige Zeitpunkt, das zweite Mal jedoch nicht (konkret: es sollen nicht CoffeeScript-Dateien mit JSLint gecheckt werden…)

Code 1: Funktioniert nicht wie gewünscht:

Beim zweiten Kopieren (mit einer neuen Quell-Datei!) wird das Ziel überschrieben, obwohl overwrite deaktiviert ist.

Glücklicherweise gibt es die mir noch unbekannten Ant Selectors, die dafür genutzt werden können.

Die Logik: Man kopiert in das Verzeichnis A das Fileset aus Verzeichnis B, aber selektiert dort nur die Dateien, die noch nicht in Verzeichnis A vorhanden sind. Problem gelöst.

Code 2: Die Lösung

Und: Die Selektoren sind sehr mächtig, es gehen also hübsche abgefahrene Dinge wie “nur Dateien die im Target neuer sind”, usw.