【问题标题】:Replacing all tokens based on properties file with ANT用 ANT 替换基于属性文件的所有令牌
【发布时间】:2011-05-29 07:57:10
【问题描述】:

我很确定这是一个很容易回答的问题,而且我在没有可靠答案之前看到过这个问题。

我有几个用于不同环境的属性文件,即 xxxx-dev、xxxx-test、xxxx-live

属性文件包含以下内容:

server.name=dummy_server_name
server.ip=127.0.0.1

我使用的模板文件如下所示:

<...>
   <server name="@server.name@" ip="@server.ip@"/>
</...>

上面是一个非常原始的示例,但我想知道是否有一种方法可以告诉 ANT 根据属性文件替换所有标记,而不必为每个标记行硬编码...即

<replacetokens>
   <token key="server.name" value="${server.name}"/>
   <token key="server.ip" value="${server.ip}"/>
</replacetokens>

任何帮助都会很棒!

【问题讨论】:

    标签: ant tokenize


    【解决方案1】:

    您可以使用replacefilterfile 指定要从中读取'replace' task 令牌列表的属性文件:

    <replace file="input.txt" replacefilterfile="properties.txt"/>
    

    同样,在过滤器链中,您可以使用'replacetokens' propertyfile

    这将处理每个属性文件 在 sample.properties 中作为 令牌/密钥对:

    <loadfile srcfile="${src.file}" property="${src.file.replaced}">
      <filterchain>
        <filterreader classname="org.apache.tools.ant.filters.ReplaceTokens">
          <param type="propertiesfile" value="sample.properties"/>
        </filterreader>
      </filterchain>
    </loadfile>
    

    【讨论】:

    • 如果您需要来自 > 1 个不同属性文件的属性,有什么方法可以做到这一点?我知道的唯一方法是创建一个将文件连接在一起的新文件 - 你知道更好的方法吗?
    • @MarkRhodes - 抱歉耽搁了......我想不出任何不等同于连接的东西。不过,这样做应该很简单。 Replacetokens 不支持用于替换的文件集。
    【解决方案2】:

    由于替换任务本身,我错过了标记周围的 @ 分隔符,所以我想出了以下解决方案。您可以在模板文件中使用任何 ant 属性

    <project name="replace" default="replace">
    
    <property file="build.properties" />
    <target name="replace">
    
        <!-- create temp file with properties -->
        <tempfile property="temp.replace" suffix=".properties"/>
        <echoproperties destfile="${temp.replace}" />
        <!-- replace name=value with @name@=value -->
        <replaceregexp file="${temp.replace}" match="([^=]*)=" replace="@\1@=" byline="true" />
    
        <!-- copy template and replace properties -->
        <copy file="template.txt" tofile="replaced.txt" />
        <replace file="replaced.txt" replacefilterfile="${temp.replace}" />
    
    </target>
    

    有模板

    ANT home @ant.home@
    ANT version @ant.java.version@
    server name @server.name@ ip @server.ip@
    

    这会导致

    ANT home /usr/share/ant
    ANT version 1.7
    server name dummy_server_name ip 127.0.0.1
    

    【讨论】:

      【解决方案3】:

      使用fileset 表单ant-contrib 您可以读取令牌表单属性文件并在多个文件中替换多个令牌。

      <project name="MyProject" default="replaceToklens" basedir=".">
          <property name="profilesProperties" value="${basedir}/environment.properties" />
          <property name="build.dir" location="build"/>
      
          <!-- File to Load/ Accessable -->
          <property file="${profilesProperties}" /> 
          <target name="replaceToklens">
              <taskdef resource="net/sf/antcontrib/antlib.xml">
                  <classpath>
                      <pathelement location="${basedir}/ant-contrib-1.0b3.jar" />
                  </classpath>
              </taskdef>
                  <mkdir dir="${build.dir}"/>
                  <filter filtersfile="${profilesProperties}" />
                  <copy todir="${build.dir}" filtering="true" overwrite="true">
                      <fileset dir="${basedir}"> <!-- target/MyProject -->
                          <include name="*.xml" />
                          <exclude name="build.xml" />
                      </fileset>
                  </copy>
          </target>
      </project>
      

      文件夹结构:

      ANT
       \_ build.xml
       \_ environment.properties
       \_ server.xml
       \_ build
              \_ server.xml   [replaced with token value]
      

      为了替换单个令牌,请使用以下内容:

      <replace file="build/server.xml" token="@keyName@" value="${keyValue}" />
      

      【讨论】:

        猜你喜欢
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 2012-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多