在ant中写出文件路径属性的问题

时间:2010-07-29 07:52:56

标签: java ant

我遇到了写出一个属性的问题,该属性将目录路径的值保存到属性文件中。

我的脚本最初使用<property file="source.props"/>从道具文件中读取此特定属性,称为“appserver.home”。我已经回应了它的值,它正确读取为 C:\\ somedir \\ jboss_4_2_3。

我的脚本接下来需要做的是将此值提供给另一个属性文件(由另一个ant脚本使用 - 尽管这并不重要)。要创建这个其他文件,我正在使用一个带有占位符的类型关闭模板文件,其中包含$ .... $以使用以下内容在正确的位置插入正确的值: -

 <copy file="template_file.props" tofile="target.props">
    <filterset begintoken="$" endtoken="$">
        <filter token="appServerDir" value="${appserver.home}"/>
        <filter token="dbusername" value="${database.name}"/>
        ....
    </filterset>
 </copy>                

问题是target.props中的值现在是 C:\ somedir \ jboss_4_2_3 ,即它丢失了转义字符。当下一个ant脚本使用此文件时,它会将属性值解释为 C:somedirjboss_4_2_3

那么问题是如何告诉ant我正在编写的值是文件路径? 注意我已经尝试了以下实际工作: -

<propertyfile file="target.props">
    <entry key="appServerDir" value="${appserver.home}"/>
</propertyfile>

..即它将名称输出为 c \:\\ somedir \\ jboss4_2_3 ,但我宁愿不使用此技术而是使用模板文件技术,因为它包含一些属性它总是静态的,以及评论等。

提前致谢

4 个答案:

答案 0 :(得分:3)

在这里处理逃跑的任务之间可能存在一些令人困惑的差异。

当你说'appserver.home'回应正确时,我想你正在使用'echoproperties'任务,它显示存储的值而不插入转义。这显示了与'source.props'文件中相同数量的转义。

问题在于,通常,当Ant将此值插入字符串时,它将使用转义符,因此它们会消失。一个例外是在'propertyfile'任务中,你通常希望保留在输出属性文件中的转义 - 正如你所观察到的那样 - 以便以后可以正确读取文件。

那么,该怎么办?

也许最简单的方法是确保从'source.props'读取的属性保留它们的转义以便在以后的过滤器中使用。所以不要使用

<property file="source.props"/>

加载,使用

<loadproperties srcfile="source.props">
    <filterchain>
        <replacestring from="\" to="\\" />
    </filterchain>
</loadproperties>

这应该确保您的转义序列传播。

答案 1 :(得分:1)

我刚刚在Ubuntu服务器10.10上使用Apache Ant version 1.7.1 compiled on May 25 2010进行了测试,并使用2008年6月27日在Windows XP上的Eclipse 3.6中编译的Apache Ant 1.7.1版。现在的结果(来自两者):

source.props中的变量:
appserver.home=C\:\\somedir\\jboss_4_2_3

在控制台上回音:
[echo] C:\somedir\jboss_4_2_3

target.properties中的变量:
appserver.home=C:\somedir\jboss_4_2_3

编辑 - 以下解决方案;-D

在我看来,您应该使用属性文件,如果您阅读了此任务的手册,您可以看到它能够MANIPUlATE现有的属性文件。这个适用于我,并且模板中的所有注释和变量都会被保留。

<copy file="template_file.props"  tofile="target.props" />
<propertyfile  file="target.props">
    <entry  key="appserver.home" value="${appserver.home}"/>
</propertyfile>

答案 2 :(得分:0)

我刚刚使用Eclipse集成的ant支持测试了以下内容:

<copy file="test.props" tofile="target.props">
    <filterset begintoken="$" endtoken="$">
    <filter token="appServerDir" value="C\:\\somedir\\jboss_4_2_3"/>
    </filterset>
</copy> 

并生成以下文件:

C\:\\\somedir\\\jboss_4_2_3

你使用的是什么蚂蚁版本?

答案 3 :(得分:0)

作为一种变通方法,您还可以使用正斜杠编写初始属性C:/somedir/jboss_4_2_3,它不需要转义字符。