Ant的复制任务过滤器内部获取文件名 [英] Getting file name inside Ant copy task filter

查看:178
本文介绍了Ant的复制任务过滤器内部获取文件名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

时有可能得到一个Ant任务,副本内被复制当前文件名?我试图运行一个脚本BeanShell的,想获得当前的文件名:

 <目标>
    < MKDIR DIR =$ {} project.build.directory /生成的来源/>
    <副本todir =$ {} project.build.directory /生成的来源
          includeemptydirs =真failonerror =真详细=真>
        <文件集DIR =$ {} project.build.sourceDirectory/>
        < filterchain>
            < tokenfilter>
                < filetokenizer />
                < scriptfilter LANGUAGE =BeanShell的署名=真><![CDATA [
                    进口java.io.BufferedReader中;
                    进口java.io.StringReader中;
                    诠释计数= 1;
                    BR的BufferedReader =新的BufferedReader(新StringReader(self.getToken()));
                    StringBuilder的建设者=新的StringBuilder();
                    串线;
                    而((行= br.readLine())!= NULL){
                        builder.append(line.replace(\\__ __ LINE \\,Integer.toString(计数)))追加('\\ n')。
                        算上++;
                    }
                    self.setToken(builder.toString());
                ]]>< / scriptfilter>
            < / tokenfilter>
        < / filterchain>
    < /复制>
< /目标与GT;


解决方案

这已被窃听我一会儿 - 我希望会有一个很好的办法做到这一点,但我没有找到它。

我有一个看蚂蚁源$ C ​​$ C为复制的任务。实际拷贝在<一个完成href=\"http://javadoc.haefelinger.it/org.apache.ant/1.7.1/org/apache/tools/ant/util/ResourceUtils.html\"相对=nofollow> ResourceUtils 类,但源和目标文件名的方式,会使他们从filterchain访问不被暴露。同样,遍历所有文件集发生在那里的当前文件名没有在公共变量中的副本的taskdef。

最不坏的选择,我想出是使用蚂蚁的contrib对于任务遍历文件集,并逐个复制每个文件。当你迭代,该文件的名称然后可在'参数'属性指定的属性:

 &lt;用于参数=file.name&GT;
  &LT;路径&GT;
    &LT;文件集DIR =$ {} project.build.sourceDirectory/&GT;
  &LT; /路径&GT;
  &LT;&连续GT;
    &lt;局部名=file.name/&GT;
    &LT;属性名=file.nameVALUE =@ {} file.name/&GT;
    &LT;复制文件=$ {} file.name...&GT;
      ...
      &LT; filterchain&GT;
        &LT; scriptfilter ...&GT;
          ...
          current_file = project.getProperty(file.name);
          ...
        &LT; / scriptfilter&GT;
      &LT; / filterchain&GT;
      ...
    &LT; /复制&GT;
  &LT; /顺序&GT;
&LT; /为&GT;

Is it possible to get the current file name being copied inside an Ant copy task? I am trying to run a beanshell script and would like access to the current file name:

<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>

解决方案

This has been bugging me for a while - I hoped there would be a nice way to do this, but I've not found it yet.

I've had a look at the Ant source code for the 'copy' task. The actual copy is done in the ResourceUtils class, but the names of the source and destination files are not exposed in a way that would make them accessible from the filterchain. Similarly, the iteration over the fileset takes place in the copy taskdef where the 'current' file names are not held in public variables.

The least-bad option I've come up with is to use an ant-contrib 'for' task to iterate over the fileset and copy each file one by one. As you iterate, the names of the files are then available in the property specified in the 'param' attribute:

<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>

这篇关于Ant的复制任务过滤器内部获取文件名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆