【问题标题】:How to validate properties/custom configuration files?如何验证属性/自定义配置文件?
【发布时间】:2011-12-12 08:28:02
【问题描述】:
我的应用程序有许多属性/文本配置文件。有没有一种通用的方法来验证这些文件?可能是一些工具或类似 xsd 的东西?
文件很大(超过 1000 行),所以我经常出错。在大多数情况下,文件中的信息 - 是不同目录的路径。因此,如果它们存在并且是一致的,那就太好了。例如。
如果我有
mydata.root="c:\data"
在我拥有之后:
myreports=${mydata.root}/reports
最好检查一下 c:\data 和 c:\data\report 是否存在
并且没有写(向下几百行)例如
myreports=${mdata.root}/reports
【问题讨论】:
标签:
java
ant
configuration
properties
directory
【解决方案1】:
您可以在构建文件中进行此验证。
例如,以下构建文件定义了一个macrodefvalidate-file-property,它验证指定的属性已定义并且它作为文件系统中的文件或目录存在。
<project default="init">
<property file="test.properties"/>
<target name="init">
<validate-file-property property="program.files" type="dir"/>
<validate-file-property property="mydata.root" type="dir"/>
<validate-file-property property="foo"/>
</target>
<macrodef name="validate-file-property">
<attribute name="property"/>
<attribute name="type" default="file"/>
<sequential>
<fail unless="@{property}" message="The property '@{property}' is undefinded."/>
<available file="${@{property}}" property="@{property}.exists" type="@{type}"/>
<fail unless="@{property}.exists" message="The @{type} '@{property}' with value '${@{property}}' does not exist."/>
</sequential>
</macrodef>
</project>
您需要决定何时验证属性,并且需要明确地验证它们 - 如本示例中的 init 目标所示。
顺便说一句,如果您使用标准化模式来命名引用文件或目录的属性 - 例如my.special.file、my.build.dir - 然后您可以使用 shell 脚本来发现所有相关属性并编写所有 validate-file-property 元素。像这样的:
awk -F= '/\.(file|dir)/{ printf "<validate-file-property property=\"%s\" type=\"%s\"/>\n", $1, gensub(/.*\.(file|dir)/, "\\1", "g", $1) }' *.properties
您可以将输出粘贴到您的构建文件中。
【解决方案2】:
我曾经提供过关于提供模式验证的 XML 以外的配置语言的信息。不幸的是,这样的配置语言很少见。
这里是一个link 给悬赏问题,以防你想看到回复的稀疏性。