我需要编写一个Ant目标,它将一个文件夹中的'.jar'文件名列表(逗号分隔)附加到一个变量中,该变量稍后用作外部实用程序的输入。 我遇到了范围和不变性的障碍。我可以访问ant-contrib,但遗憾的是我遇到的版本无法访问'for'任务。这是我到目前为止所做的:
<target name="getPrependJars">
<var name="prependJars" value="" />
<foreach param="file" target="appendJarPath">
<path>
<fileset dir="${project.name}/hotfixes">
<include name="*.jar"/>
</fileset>
</path>
</foreach>
<echo message="result ${prependJars}" />
</target>
<target name="appendJarPath">
<if>
<equals arg1="${prependJars}" arg2="" />
<then>
<var name="prependJars" value="-prependJars ${file}" />
</then>
<else>
<var name="prependJars" value="${prependJars},${file}" />
</else>
</if>
</target>
似乎'appendJarPath'仅在其自己的范围内修改'prependJars'。作为测试,我尝试使用'antcallback',它适用于单个目标调用,但对我的文件列表没有多大帮助。
我意识到我在某种程度上对抗谷物,并且在绝大多数情况下词汇范围是可取的,但我真的希望以某种方式工作。有没有人有任何创意来解决这个问题?
答案 0 :(得分:9)
您可以使用pathconvert
task,它允许您将分隔符指定为逗号。
<target name="getPrependJars">
<fileset id="appendJars" dir="${project.name}/hotfixes">
<include name="*.jar" />
</fileset>
<pathconvert property="prependJars" refid="appendJars" pathsep="," />
<echo message="prependJars: ${prependJars}" />
</target>
答案 1 :(得分:2)
我只是在Java中编写一个自定义任务,(1)获取文件夹名称,(2)汇总结果字符串,(3)将其存储到$ {prependJars}属性。
在蚂蚁中,您只需定义任务(taskdef
),然后像之后的所有其他任务一样使用。
当我面对一个类似的问题时,我做了一次,发现这非常非常容易。
这是tutorial。
答案 2 :(得分:2)
如果系统路径格式对您有用,您可以使用以下内容:
<target name="getPrependJars">
<path id="prepend.jars.path">
<fileset dir="${project.name}/hotfixes">
<include name="*.jar"/>
</fileset>
</path>
<property name="prependJars" value="${toString:prepend.jars.path}" />
<echo message="result ${prependJars}" />
</target>