如何使用 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#(.*) 匹配&lt;newline&gt;(\n) 后跟# 后跟任意字符集(*)。

【讨论】:

以上是关于如何使用 ant build 从属性文件中删除注释属性?的主要内容,如果未能解决你的问题,请参考以下文章

eclipse ant build failed 无法删除文件 lib\build

ant过滤 - 如果未设置属性,则失败

从 Ant build.xml 中的 .properties 文件中读取

Ant 脚本 - 如何从 plist 文件中打印一些文本并将其分配给属性

在 Ant 中如何输出属性值?

Ant—使用Ant构建简单Java项目