获取目录中的jar列表并将其发送到另一个ANT目标

时间:2013-11-19 22:13:03

标签: java ant

我有一个包含jar的目录。我没有他们的名字,我有一个目标,它采用jar的名称及其位置,并对其进行操作。

<target name="addAttributes">
    <mkdir dir="${folderName}/Temp"/>
    <unzip src="${jarNamewtPath}" dest="${folderName}/Temp"/>
    <delete file="${jarNamewtPath}"/>
    <jar destfile="${jarNamewtPath}">
        <manifest>
            <attribute name="Application-Name" value="someValue"/>
            <attribute name="Trusted-Only" value="true"/>
            <attribute name="Codebase" value="*"/>
            <attribute name="Permissions" value="all-permissions"/>
        </manifest>
        <fileset dir="${folderName}/Temp" />
    </jar>
    <delete dir="${folderName}/Temp"/>
</target>

如何获取文件的名称并将它们单独传递给此目标。

<target name="getJars">
    <fileset id="getJars" dir="${someDir}/Jars">
        <include name="*.jar" />
    </fileset>
    ..... get list of jars
    <antcall target="addAttributes">
            <param name="folderName" value="${path}"/>
            <param name="jarNamewtPath" value="${path}/name.jar"/>
    </antcall> 
</target>

任何帮助/线索将不胜感激。

1 个答案:

答案 0 :(得分:1)

最好每个版本只调用<target>一次。对于可在构建中重复使用的共享功能,请考虑使用<macrodef>

以下是使用第三方Ant-Contrib的<for> task重复调用addAttributes <macrodef>的示例:

<project name="ant-for-macrodef" default="getJars">
    <taskdef resource="net/sf/antcontrib/antlib.xml" />

    <macrodef name="addAttributes">
        <attribute name="jar-path"/>
        <sequential>
            <echo>jar-path: @{jar-path}</echo>

            <!-- Make temp.dir locally scoped to this macrodef. -->
            <local name="temp.dir"/>
            <property name="temp.dir" value="myTempDir"/>

            <echo>Perform Jar operations here.</echo>
        </sequential>
    </macrodef>

    <target name="getJars">
        <fileset id="getJars" dir="${someDir}/Jars">
            <include name="*.jar" />
        </fileset>

        <for param="jar.file">
            <fileset refid="getJars"/>
            <sequential>
                <addAttributes jar-path="@{jar.file}"/>
            </sequential>
        </for>
    </target>
</project>