Java Getriebe

Java und NetBeans

8.3 Namen in Ant unter Windows ermitteln

Ich brauchte in einem Ant Skript unbedingt einen Pfad, der keine Leerzeichen enthält. Leider konnte ich nicht vorher definieren, welcher Pfad das zur Laufzeit des Skriptes sein wird. Da hatte ich keinen Einfluss drauf. Da ich aber wusste, das das Skript auf jeden Fall auf einem Windows Rechner laufen wird, bestand die einzige Möglichkeit darin die von Windows immer noch unterstützen alten DOS 8.3 Namen zu verwenden. Das Problem ist, „Ant“ selber kennt dafür keinen Befehl oder Attribute bei einem Task (oder ich habe ihn nicht gefunden!)

Dafür unterstützt der „for“-Befehl unter den aktuellen Windows Versionen bei der Variablenersetzung die Option den Pfad als genau diese 8.3-Namen auszugeben. Damit lässt sich zum Beispiel das aktuelle Verzeichnis jederzeit als 8.3 Version ausgeben:

1
for /F "delims=*" %i in ('echo "%CD%"') do @echo %~dpnxsi

Diesen Umstand kann man sich im ant-Skript dann zu Nutze machen und einen <exec>-Task ausführen und dessen Ausgabe direkt in eine Property-Variable speichern. Damit das ganze noch schöner wird habe ich das ganze auch noch in ein Makro verpackt:

1
2
3
4
5
6
7
8
9
10
<macrodef name="shortpath">
  <attribute name="path"/>
  <attribute name="property"/>
  <sequential>
    <exec dir="${basedir}" executable="cmd.exe" outputproperty="@{property}">
      <arg value="/c"/>
      <arg value="for /F &quot;delims=*&quot; %i in ('echo &quot;@{path}&quot;') do @echo %~dpnxsi"/>
    </exec>
  </sequential>
</macrodef>

Der Aufruf erfolgt dann an anderer Stelle zum Beispiel so:

1
<shortpath path="${java.io.tmpdir}" property="nospacetemp"/>