我遇到了写出一个属性的问题,该属性将目录路径的值保存到属性文件中。
我的脚本最初使用<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 ,但我宁愿不使用此技术而是使用模板文件技术,因为它包含一些属性它总是静态的,以及评论等。
提前致谢
答案 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
,它不需要转义字符。