【问题标题】:Issue writing out file path properties in ant在 ant 中写出文件路径属性的问题
【发布时间】:2011-03-22 14:01:54
【问题描述】:

我在将保存目录路径值的属性写入属性文件时遇到问题。

我的脚本最初从使用<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,但我宁愿不使用这种技术,而是使用模板文件技术,因为它包含一些属性它们总是静态的,以及 cmets 等。

提前致谢

【问题讨论】:

    标签: java ant


    【解决方案1】:

    在处理逃逸事件方面,任务之间可能存在一些令人困惑的差异。

    当您说“appserver.home”正确回显时,我猜您正在使用“echoproperties”任务,它向您显示存储的值而无需插入转义。这显示了与“source.props”文件中相同数量的转义。

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

    那么,该怎么办?

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

    <property file="source.props"/>
    

    加载,使用

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

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

    【讨论】:

      【解决方案2】:

      我刚刚在 Ubuntu 服务器 10.10 上使用 Apache Ant version 1.7.1 compiled on May 25 2010 进行了测试,并在 Windows XP 上的 Eclipse 3.6 中使用了 2008 年 6 月 27 日编译的 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

      EDIT - 下面的解决方案;-D

      在我看来,您应该使用 propertyfile,如果您阅读此任务的手册,您会发现它能够操作现有的属性文件。这个对我有用,模板中的所有 cmets 和 vars 都被保留了。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这可行,但不幸的是,我无法控制创建初始属性文件 (!) 的过程。谢谢。
        【解决方案4】:

        我刚刚使用 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
        

        你用的是什么ant版本?

        【讨论】:

        • 我使用的是 ant 1.7.1。但是您的示例与我的示例略有不同,因为您直接传递值,即硬编码。-您是否尝试过设置一些属性,并改为传递该值?
        • @Neil 是的,我试过了,输出是一样的:C\:\\somedir\\jboss_4_2_3
        • @Manuel - 你在 Eclipse 中使用的是什么版本的 ant?
        • @Neil ${ant.version} 打印:2008 年 6 月 27 日编译的 Apache Ant 版本 1.7.1
        • @Manuel - 感谢您提供帮助。但是 - 对于 Ant 版本,我得到与您相同的确切输出,但行为不同。当我执行 并将其传递给过滤器集时,它仍然被写为 C:\somedir\jboss_4_2_3 - 这对我的要求是错了,因为我不想丢失转义字符。我想唯一的区别是,听起来你正在使用 eclipse 运行——而我是从命令提示符运行的。你自己试过吗?
        猜你喜欢
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-27
        • 1970-01-01
        • 1970-01-01
        • 2014-05-29
        相关资源
        最近更新 更多