Search code examples
antjpegtran

Ant: How to use apply task with identical source and target file


I am trying to run an apply task with the following command:

  jpegtran.exe -copy none -optimize -perfect ./images/file.jpg ./images/file.jpg

I would like to apply it recursively for all images. I have tried the following ant code but jpegtran says invalid arguments.

<target name="optimize.images.jpg">
    <apply executable="jpegtran.exe" dir="${SRC_DIR}/public/assets/" parallel="false" verbose="true" resolveexecutable="true" force="true" vmlauncher="true">
        <arg value="-copy none"/>
        <arg value="-optimize"/>
        <arg value="-perfect"/>
        <srcfile/>
        <targetfile/>
        <fileset dir="${SRC_DIR}/public/assets/images" casesensitive="yes">
            <include name="**/*.jpg"/>
        </fileset>
        <mapper type="identity"/>
    </apply>
</target>

What could be wrong with my ant code?


Solution

  • One item that needs to be changed is the nested <arg> element for -copy none. Since there is a space in the argument, use the line attribute instead of value. See Apache Ant command line arguments.

    <target name="optimize.images.jpg">
      <apply executable="jpegtran.exe" dir="${SRC_DIR}/public/assets/" 
        parallel="false" verbose="true" resolveexecutable="true" force="true" 
        vmlauncher="true">
    
        <arg line="-copy none"/>
        <arg value="-optimize"/>
        <arg value="-perfect"/>
        <srcfile/>
        <targetfile/>
        <fileset dir="${SRC_DIR}/public/assets/images" casesensitive="yes">
          <include name="**/*.jpg"/>
        </fileset>
        <mapper type="identity"/>
      </apply>
    </target>