如何使用 ant build 从属性文件中删除注释属性?
Posted
技术标签:
【中文标题】如何使用 ant build 从属性文件中删除注释属性?【英文标题】:How to remove commented properties from properties file using ant build? 【发布时间】:2019-05-25 13:42:52 【问题描述】:我想通过 ant build 从属性文件中删除注释属性。出于安全目的,我不想在沙盒服务器上公开我的生产属性。
属性文件:
#production properties
#redis.master.url=redis.prod.master.compny.com
#redis.slave.url=redis.prod.slave.compny.com
#sandboxproperties
redis.master.url=redis.sandbox.master.compny.com
redis.slave.url=redis.sandbox.slave.compny.com
所以,我的war包应该有以下属性文件:
redis.master.url=redis.sandbox.master.compny.com
redis.slave.url=redis.sandbox.slave.compny.com
【问题讨论】:
有更好的方法来做到这一点。我会创建两个属性文件,并有不同的 Ant 目标,例如<target name="sandbox">
和 <target name="production">
,每个目标都将所需的属性文件复制到应用程序期望的名称下的构建中。
听起来不错;所以如果将目标设置为sandbox
,生产属性将不会打包在存档中?
是的,没错。
【参考方案1】:
根据Ant docs:
Apache Ant 提供了一个用于编辑属性文件的可选任务。当想要对应用程序服务器和应用程序的配置文件进行无人值守的修改时,这非常有用。目前,该任务维护一个工作属性文件,能够添加属性或更改现有属性。 从 Ant 1.8.0 开始保留原始属性文件的 cmets 和布局。
因此,根据您使用的 ant 构建版本,您可能能够从属性文件中删除 cmets。
【讨论】:
【参考方案2】:您可以使用 ant 中的脚本来完成:
<macrodef name="remove-properties-comments">
<attribute name="inFile" />
<attribute name="outFile" />
<sequential>
<script language="javascript">
<![CDATA[
// get the arguments
var inFile = "@inFile"
var outFile = "@outFile"
// or get properties from the ant environment
// eg: <property name="property.from.ant.project" value="value" />
// var antProp = project.getProperty("property.from.ant.project");
// load Java types
var File = Java.type("java.io.File")
var PrintWriter = Java.type("java.io.PrintWriter")
var Scanner = Java.type("java.util.Scanner")
// init reader and writer
var reader = new Scanner(new File(inFile))
var writer = new PrintWriter(outFile)
// if previous line ended in '\' then it is a muliline property
// so the following line should always be included
var multiline = false
while (reader.hasNextLine())
var line = reader.nextLine();
// you could exclude blank lines too if you want
if (multiline || !(line.startsWith("#") || line.startsWith("!")))
writer.println(line);
multiline = line.endsWith("\\");
]]>
</script>
</sequential>
</macrodef>
<target name="test">
<remove-properties-comments inFile="path/to/inFile.properties" outFile="path/to/outFile.properties" />
</target>
【讨论】:
感谢 xtratic,我找到了一种适用于所提供目录中每个文件的方法(发布了我的答案)。【参考方案3】:我只是通过使用replaceregexp
解决了这个问题。
<target>
<replaceregexp match="\n#(.*)" replace="" flags="g" byline="false">
<fileset dir="$build.home/WEB-INF/classes" includes="**/*.properties" />
</replaceregexp>
</target>
这里\n#(.*)
匹配<newline>
(\n
) 后跟#
后跟任意字符集(*
)。
【讨论】:
以上是关于如何使用 ant build 从属性文件中删除注释属性?的主要内容,如果未能解决你的问题,请参考以下文章
eclipse ant build failed 无法删除文件 lib\build
从 Ant build.xml 中的 .properties 文件中读取