首页 > 解决方案 > 如何从 ant build 中的 .properties 文件中读取部分?

问题描述

我有带有变量=值的 .properties 文件,我想根据环境/模式(DEV、QA、PROD)覆盖其中的一些文件

我想根据部分从文件中读取属性。想要读取任何部分之外的所有默认属性,并且应该根据给定的部分名称覆盖一些属性,我可以在读取属性文件时从 ant 脚本传递这些属性。

---project.properties 文件(可修改)---

#default
var1=val1
url=abc.xyz
un=un_default
pwd=pwd_default

#Mode prod
[PROD]
un=un_dev
pwd=pwd_prod
[PROD.END]

#Mode dev
[DEV]
url=xyz.dev
un=un_dev
pwd=pwd_dev
[DEV.END]

#Mode qa
[QA]
un=un_qa
pwd=pwd_qa
[QA.END]

------ 蚂蚁 -----

<property environment="env" />
<echo>Mode : ${env.MODE} </echo>

<loadproperties srcfile="project.properties">
</loadproperties>

现在如何在读取属性文件时传递 ${env.MODE} 以便加载所有默认和模式/部分属性,如果默认值已经存在,那么应该在部分中通过值覆盖。

标签: javabuildpropertiesantantbuilder

解决方案


Ant 有一个“先读即值的方法”,因此您不能读取默认值然后尝试覆盖;相反,您先阅读细节,然后阅读默认值,默认值不会替换任何已设置的内容。有一些方法可以解决这个问题,但更容易接受一次设置不会更改的方法。

无论如何,我都不知道要读取文件的一部分。相反,该方法通常是将每个 dev/qa/prod 放入单独的文件中,然后使用特定模式构造文件名并将其读入。

这是我刚刚从我们的一个项目中摘录的一个例子。这个想法是,可以有一系列可以设置值的位置,在这种情况下,允许根据用户名加上主机、仅用户或默认值进行调整:

<property environment="env" />
<property name="env.HOSTNAME" value="${env.COMPUTERNAME}" />

<property file="${user.name}-${env.HOSTNAME}-build.properties" />
<property file="${user.name}-build.properties" />
<property file="${basedir}/build.properties" />

推荐阅读