Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用ant脚本复制属性文件中定义的文件名_Java_Ant - Fatal编程技术网

Java 如何使用ant脚本复制属性文件中定义的文件名

Java 如何使用ant脚本复制属性文件中定义的文件名,java,ant,Java,Ant,我有一个属性文件test.properties。它包含如下文件名 web/web-INF/a.java web/b.jsp 我想从属性文件test.properties中读取这些文件名,并将这些文件名复制到一个目录中。请帮助我解决此问题。堆栈溢出现在是唯一的希望。提前感谢 到目前为止,我认为解决这个问题的方法是加载属性文件,如下所示 <loadfile property="path" srcFile="${basedir}/test.properties"/> 但是如何解析

我有一个属性文件test.properties。它包含如下文件名

  • web/web-INF/a.java
  • web/b.jsp
我想从属性文件test.properties中读取这些文件名,并将这些文件名复制到一个目录中。请帮助我解决此问题。堆栈溢出现在是唯一的希望。提前感谢

到目前为止,我认为解决这个问题的方法是加载属性文件,如下所示

<loadfile property="path" srcFile="${basedir}/test.properties"/>


但是如何解析属性“路径”内容?

要从文件加载属性,您应该使用该任务

更新

我修改了答案,添加了第二个示例,该示例读取文本文件而不是属性文件。它使用嵌入式脚本读取文件并将其复制到目标目录

我警告不要使用。它非常流行,但根据我的经验,如果需要执行复杂的处理,最好使用普通编程语言。Javascript是一个明显的选项(不需要额外的JAR),但我喜欢groovy,因为它与ANT的出色集成

示例1:使用属性文件 构建属性 编译文件 build.txt 编译文件

新文件(“build.txt”).eachLine{
copy(文件:it,todir:“target”,详细:true)
}
注意事项:

  • 运行“ant bootstrap”从Maven Central安装第三方groovy jar

要从文件加载属性,应使用任务

更新

我修改了答案,添加了第二个示例,该示例读取文本文件而不是属性文件。它使用嵌入式脚本读取文件并将其复制到目标目录

我警告不要使用。它非常流行,但根据我的经验,如果需要执行复杂的处理,最好使用普通编程语言。Javascript是一个明显的选项(不需要额外的JAR),但我喜欢groovy,因为它与ANT的出色集成

示例1:使用属性文件 构建属性 编译文件 build.txt 编译文件

新文件(“build.txt”).eachLine{
copy(文件:it,todir:“target”,详细:true)
}
注意事项:

  • 运行“ant bootstrap”从Maven Central安装第三方groovy jar

这里src1和src2是test.properties中定义的路径变量

编辑:

在这种情况下,您可以将load file与for task结合使用(逐行读取文件),如下所示:

<project name="sample">

  <taskdef resource="net/sf/antcontrib/antcontrib.properties">
    <classpath>
      <pathelement location="path/to/ant-contrib.jar"/>
    </classpath>
  </taskdef>

<loadfile property="file" srcfile="test.txt"/>

  <target name="copy">
    <for param="line" list="${file}" delimiter="${line.separator}">
      <sequential>
        <copy file="@{line}" todir="dest" />
      </sequential>
    </for>
  </target>
 </project>

您必须使用
ant contrib
执行
任务

希望这有帮助。


这里src1和src2是test.properties中定义的路径变量

编辑:

在这种情况下,您可以将load file与for task结合使用(逐行读取文件),如下所示:

<project name="sample">

  <taskdef resource="net/sf/antcontrib/antcontrib.properties">
    <classpath>
      <pathelement location="path/to/ant-contrib.jar"/>
    </classpath>
  </taskdef>

<loadfile property="file" srcfile="test.txt"/>

  <target name="copy">
    <for param="line" list="${file}" delimiter="${line.separator}">
      <sequential>
        <copy file="@{line}" todir="dest" />
      </sequential>
    </for>
  </target>
 </project>

您必须使用
ant contrib
执行
任务


希望这能有所帮助。

您可能需要将或资源集合与一起使用

而不是

src/a.txt   --> dest/a.txt
src/b/b.txt --> dest/b/b.txt
然后使用带有展平的
任务:

<copy todir="${dest.dir}" flatten="yes">
    ...
</copy>

...

您可以使用
任务应用更复杂的名称映射规则。

您可能需要将或资源集合用于

而不是

src/a.txt   --> dest/a.txt
src/b/b.txt --> dest/b/b.txt
然后使用带有展平的
任务:

<copy todir="${dest.dir}" flatten="yes">
    ...
</copy>

...


您可以使用
任务应用更复杂的名称映射规则。

您有固定数量的文件吗?没有,文件数量不断变化如果您没有密钥,则它不是属性文件。按照惯例,
*.properties
文件的格式是由
java.util.properties
读取的,最好将文件命名为其他名称。好的,那么我将把它命名为.txt文件。但是我该如何着手解决上述问题?@user333366 Martin Clayton提供了答案。在文件集上使用“includeFile”属性是最好的解决方案。您有固定数量的文件吗?没有,文件数量不断变化如果您没有密钥,则它不是属性文件。按照惯例,
*.properties
文件的格式是由
java.util.properties
读取的,最好将文件命名为其他名称。好的,那么我将把它命名为.txt文件。但是我该如何着手解决上述问题?@user333366 Martin Clayton提供了答案。在文件集上使用“includeFile”属性是最好的解决方案。谢谢mark,但是属性文件中定义的文件数量不断变化,并且属性文件中没有像file1=或file2=这样的密钥持有者,它只有像src/a这样的内容。java@user3313366我修改了我的答案,添加了一个额外的示例,该示例读取要从文本文件复制的文件。希望这对Hanks Mark有帮助GroovyTanks Mark的解决方案很好,但是属性文件中定义的文件数量不断变化,并且属性文件中没有像file1=或file2=这样的密钥持有者,它只有像src/a这样的内容。java@user3313366我修改了我的答案,添加了一个额外的示例,该示例读取要从文本文件复制的文件。希望这对Hanks Mark有帮助。GroovyTanks sanjeev的解决方案很好。但是这对我来说不起作用,因为我的属性文件中没有任何密钥持有者。属性文件只是有一个complte文件名,比如web/web-INF/a.java。。。。以此类推,在每一行上,以及属性中定义的文件数量都在不断变化。但是这对我来说不起作用,因为属性文件中没有任何密钥持有者。属性文件只是有一个complte文件名,类似于web/web-INF/a.java。
<project name="sample">

  <property file="test.properties"/>

  <target name="copy">
    <copy file="${src1}" todir="dest" />
    <copy file="${src2}" todir="dest" />
  </target>

</project>
<project name="sample">

  <taskdef resource="net/sf/antcontrib/antcontrib.properties">
    <classpath>
      <pathelement location="path/to/ant-contrib.jar"/>
    </classpath>
  </taskdef>

<loadfile property="file" srcfile="test.txt"/>

  <target name="copy">
    <for param="line" list="${file}" delimiter="${line.separator}">
      <sequential>
        <copy file="@{line}" todir="dest" />
      </sequential>
    </for>
  </target>
 </project>
<copy todir="${dest.dir}">
    <fileset dir="${src.dir}" includesfile="${list_of_files.file}" />
</copy>
src/a.txt   --> dest/a.txt
src/b/b.txt --> dest/b.txt
src/a.txt   --> dest/a.txt
src/b/b.txt --> dest/b/b.txt
<copy todir="${dest.dir}" flatten="yes">
    ...
</copy>