我有一个包含多个属性的属性文件。多个(对我们的)产品有效,有些仅适用于一种产品(不能通过属性名称区分)。因此,在一个产品的基于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帮助程序类?
答案 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" />