Java 如何使用ant脚本复制属性文件中定义的文件名
我有一个属性文件test.properties。它包含如下文件名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"/> 但是如何解析
- web/web-INF/a.java
- web/b.jsp
<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
新文件(“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>