Java 在ant中写出文件路径属性的问题
我在将保存目录路径值的属性写入属性文件时遇到问题 我的脚本最初使用Java 在ant中写出文件路径属性的问题,java,ant,Java,Ant,我在将保存目录路径值的属性写入属性文件时遇到问题 我的脚本最初使用从一个props文件读取这个特定属性,称之为“appserver.home”。我回显了输入的值,它正确地读取为C:\\somedir\\jboss\u 4\u 2\u 3 我的脚本接下来需要做的是将该值提供给另一个属性文件(由另一个ant脚本使用-尽管这并不重要)。要创建另一个文件,我将使用一个带有由$....$包围的占位符的分类模板文件,使用以下命令在正确的位置插入正确的值:- <copy file="template_
从一个props文件读取这个特定属性,称之为“appserver.home”。我回显了输入的值,它正确地读取为C:\\somedir\\jboss\u 4\u 2\u 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\u 4\u 2\u 3,即它丢失了转义字符。当下一个ant脚本使用此文件时,它将属性值解释为C:somedirjboss_4_2_3
那么问题是我如何告诉ant我正在写的值是一个文件路径?
注意:我尝试了以下方法,但实际上效果很好:-
<propertyfile file="target.props">
<entry key="appServerDir" value="${appserver.home}"/>
</propertyfile>
。。ie将名称输出为c\:\\somedir\\jboss4\u 2\u 3,但我不想使用此技术,而是使用模板文件技术,因为它包含一些始终是静态的属性以及注释等
提前感谢我刚刚使用Eclipse集成的ant支持测试了以下内容:
<copy file="test.props" tofile="target.props">
<filterset begintoken="$" endtoken="$">
<filter token="appServerDir" value="C\:\\somedir\\jboss_4_2_3"/>
</filterset>
</copy>
您使用的ant版本是什么?作为一种解决方法,您还可以使用前斜杠编写初始属性,如
C:/somedir/jboss_4_2_3
,它不需要转义字符。在处理转义方面,任务之间可能存在一些令人困惑的差异
当您说“appserver.home”正确回音时,我猜您使用的是“echoproperties”任务,它显示存储的值而不插入转义。这显示了与“source.props”文件中相同的转义次数
问题是,一般来说,当Ant将这个值插入到字符串中时,它将消耗转义,因此它们将消失。“propertyfile”任务中有一个例外,您通常希望转义保留在输出属性文件中(如您所观察到的),以便以后可以正确读取该文件
那么,该怎么办
也许最简单的事情是确保从“source.props”读取的属性保留其转义,以便在以后的过滤器中使用。因此,与其使用
<property file="source.props"/>
要加载,请使用
<loadproperties srcfile="source.props">
<filterchain>
<replacestring from="\" to="\\" />
</filterchain>
</loadproperties>
这将确保转义序列的传播。我刚刚使用2010年5月25日在Ubuntu服务器10.10上编译的Apache Ant版本1.7.1进行了测试,并使用2008年6月27日在Windows XP上的Eclipse 3.6中编译的Apache Ant版本1.7.1进行了测试。现在,结果(来自两个相同的方面): source.props中的变量:
appserver.home=C\:\\somedir\\jboss\u 4\u 2\u 3
控制台上的回声:[echo]C:\somedir\jboss\u 4\u 2\u 3
target.properties中的变量:appserver.home=C:\somedir\jboss\u 4\u 2\u 3
编辑以下解决方案-D
我认为您应该使用属性文件,如果您阅读此任务的手册,您可以看到它能够操作现有的属性文件。这一个对我有效,模板中的所有注释和变量都被保留
<copy file="template_file.props" tofile="target.props" />
<propertyfile file="target.props">
<entry key="appserver.home" value="${appserver.home}"/>
</propertyfile>
我正在使用ant 1.7.1。但是您的示例与我的示例略有不同,因为您直接输入的值是硬编码的。-您是否尝试过设置某个属性,然后输入该属性的值?@Neil是的,我尝试过,结果是相同的:C\:\\somedir\\jboss\u 4\u 2_3@Manuel-您在Eclipse中使用的ant版本是什么?@Neil${ant.version}打印:ApacheAnt版本1.7.1于6月27日编译2008@Manuel-谢谢你的帮忙。但是-对于Ant版本,我得到了与您相同的精确输出,但行为不同。当我这样做并将其传递到filterset时,它仍然写为C:\somedir\jboss_4_2_3-这对于我的要求是错误的,因为我不想丢失转义字符。我想唯一的区别是,听起来您使用的是eclipse,而我使用的是命令提示符。您自己尝试过这样做吗?这样可以,但不幸的是,我无法控制创建初始属性文件(!)的过程。谢谢
<copy file="template_file.props" tofile="target.props" />
<propertyfile file="target.props">
<entry key="appserver.home" value="${appserver.home}"/>
</propertyfile>