【问题标题】:How to remove commented properties from properties file using ant build?如何使用 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,生产属性将不会打包在存档中?
  • 是的,没错。

标签: java ant properties-file


【解决方案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) 后跟# 后跟任意字符集(*)。

    【讨论】:

      猜你喜欢
      • 2019-05-19
      • 2016-09-08
      • 2015-03-02
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      相关资源
      最近更新 更多