是否可以在Ant复制任务中复制当前文件名?我正在尝试运行beanshell脚本,并希望访问当前文件名:
<target>
<mkdir dir="${project.build.directory}/generated-sources"/>
<copy todir="${project.build.directory}/generated-sources"
includeemptydirs="true" failonerror="true" verbose="true">
<fileset dir="${project.build.sourceDirectory}"/>
<filterchain>
<tokenfilter>
<filetokenizer/>
<scriptfilter language="beanshell" byline="true"><![CDATA[
import java.io.BufferedReader;
import java.io.StringReader;
int count = 1;
BufferedReader br = new BufferedReader(new StringReader(self.getToken()));
StringBuilder builder = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
builder.append(line.replace("\"__LINE__\"", Integer.toString(count))).append('\n');
count++;
}
self.setToken(builder.toString());
]]></scriptfilter>
</tokenfilter>
</filterchain>
</copy>
</target>
答案 0 :(得分:3)
这一直困扰着我一段时间 - 我希望有一个很好的方法来做到这一点,但我还没有找到它。
我已经看过'复制'任务的Ant源代码了。实际副本在ResourceUtils类中完成,但源文件和目标文件的名称不会以使其可从过滤链访问的方式公开。类似地,文件集的迭代发生在copy taskdef中,其中“当前”文件名不保存在公共变量中。
我提出的最不好的选择是使用ant-contrib 'for' task迭代文件集并逐个复制每个文件。在迭代时,文件的名称随后可在'param'属性中指定的属性中使用:
<for param="file.name">
<path>
<fileset dir="${project.build.sourceDirectory}"/>
</path>
<sequential>
<local name="file.name"/>
<property name="file.name" value="@{file.name}"/>
<copy file="${file.name}" ... >
...
<filterchain>
<scriptfilter ...>
...
current_file = project.getProperty( "file.name" );
...
</scriptfilter>
</filterchain>
...
</copy>
</sequential>
</for>