<?xml version="1.0" encoding="UTF-8"?>To run this target:
<project basedir="." default="trim" name="test">
<target name="trim">
<trim input="${text}" property="text.trimmed" />
<echo message="original text='${text}'" />
<echo message="trimmed text='${text.trimmed}'" />
</target>
<macrodef name="trim">
<attribute name="input" />
<attribute name="property" />
<sequential>
<tempfile property="temp.file" />
<echo file="${temp.file}" message="@{input}" />
<move file="${temp.file}" tofile="${temp.file}.2">
<filterchain>
<trim/>
</filterchain>
</move>
<loadfile property="@{property}" srcFile="${temp.file}.2" />
<delete file="${temp.file}.2" failonerror="false" />
</sequential>
</macrodef>
</project>
/tmp > ant -Dtext=' a b c 'The ant macro named trim declares the trim operation, while the trim target shows an example of calling the trim macro.
Buildfile: build.xml
trim:
[move] Moving 1 file to /tmp
[delete] Deleting: /tmp/null1355243589.2
[echo] original text=' a b c '
[echo] trimmed text='a b c'
BUILD SUCCESSFUL
Total time: 0 seconds
There are other solutions to achive the same result, e.g., write a custom ant task, or use ant-contrib tasks. But the advantage of this sample is that it only uses built-in ant tasks and no other library jars are needed.