ANT:复制文本文件的某些部分

时间:2016-12-13 08:38:29

标签: java ant

我有一个包含多个属性的属性文件。多个(对我们的)产品有效,有些仅适用于一种产品(不能通过属性名称区分)。因此,在一个产品的基于ANT的构建过程中,我想将包含所有属性的原始文件复制到产品特定文件,跳过适用于其他产品的部分。我可以想象使用一些开始和结束标记,例如

foo.bar=hello

# begin-product1
foo.bazz=world
# end-product1

# begin-product2
woohoo.bart=bla-bla
# end-product2

对于产品1,我想获取文件

foo.bar=hello

foo.bazz=world

和产品2

foo.bar=hello

woohoo.bart=bla-bla

使用ANT是可能的,还是应该编写自己的Java帮助程序类?

1 个答案:

答案 0 :(得分:1)

您可以将其用作"香草蚂蚁"起点并根据您的需要进行调整。

此处假设您希望一次处理一个产品,并在给定产品编号的情况下,将该产品的属性加载到当前版本中。

方法是实现执行此操作的macro。提供的属性是属性文件名称和产品编号。宏读取文件两次,提取公共部分,然后提取产品特定部分,然后将这些部分连接起来并作为Ant属性加载。

您可以调整此宏,例如,获取产品所需的文件片段,并写出特定于产品的属性文件(使用Ant <echo>任务)。如果需要,还可以将划分各个部分的字符串抽象为宏的属性或参数。在示例中,我在传递到<loadproperties>任务的特定于产品的字符串中包含了开始/结束标记。

<macrodef name="loadProductProperties">
  <attribute name="propertiesFile" />
  <attribute name="product" />

  <sequential>
    <local name="config.common" />
    <local name="config.product" />

    <loadfile property="config.common" srcFile="@{propertiesFile}">
      <filterchain>
        <tokenfilter>
          <filetokenizer/>
             <replaceregex pattern="^(.*?)# begin-product.*" replace="\1" flags="s" />
        </tokenfilter>
      </filterchain>
    </loadfile>

    <loadfile property="config.product" srcFile="props.txt">
      <filterchain>
        <tokenfilter>
          <filetokenizer/>
             <replaceregex
                pattern="^.*(# begin-product@{product}\b.*?# end-product@{product}\b).*"
                replace="\1" flags="s" />
        </tokenfilter>
      </filterchain>
    </loadfile>

    <loadproperties>
        <string value="${config.common}${config.product}" />
    </loadproperties>
  </sequential>
</macrodef>

<loadProductProperties propertiesFile="props.txt" product="2" />