静态变量读取属性文件
最近,我尝试在应用程序服务器中定义和读取全局属性。 在应用程序服务器中配置的此类属性的好处–可以在此服务器上部署的所有Web应用程序之间共享该属性。 每个部署的应用程序都可以读取同一属性,该属性仅在一个位置配置一次。 我试图做的是一个系统属性,值部分包含另一个系统属性。 在应用服务器JBoss / WildFly中,您可以例如在配置文件standalone.xml
定义系统属性。 我设置属性exporting.service.config.file
。
<system-properties><property name="exporting.service.config.file" value="${jboss.server.config.dir}\exporting\exporting-service.properties"/>
</system-properties>
jboss.server.config.dir
指向JBoss中的基本配置目录。 此属性由JBoss自动设置。 在这个例子中,我们有一个所谓的Variable Interpolation
。 维基百科的定义 :“变量插值(也就是变量替换或变量扩展)是评估包含一个或多个占位符的字符串文字的过程,产生的结果是,占位符被其对应的值替换”。 属性值占位符${...}
另一个示例是以下配置:
application.name=My App
application.version=2.0
application.title=${application.name} ${application.version}
现在,当我们尝试使用Java的System.getProperty(...)
从第一个示例获取系统属性时
String globalConfigFile = System.getProperty("exporting.service.config.file");
我们将获得${jboss.server.config.dir}\exporting\exporting service.properties
。 占位符${jboss.server.config.dir}
未解析。 第二个例子中也有同样的麻烦。
用变量插值读取属性的最简单方法是什么? 好吧,这里有带有PlaceholderConfigurerSupport的Spring框架等等。 但是拥有如此大的框架(如依赖关系)是一项开销。 有轻量级的图书馆吗? 是的,可以确定-Apache Commons Configuration 。 Apache Commons Configuration为属性提供了特殊的前缀名称,以便在特定上下文中评估它们。 例如:
-
sys:
此前缀将变量标记为系统属性。 Commons Configuration将搜索具有给定名称的系统属性,并将变量替换为其值。 -
const:
前缀表示将变量解释为类的常量成员字段。 变量的名称必须是完全限定的类名称。 -
env:
前缀引用特定于操作系统的环境属性。
文档中的一些示例:
user.file = ${sys:user.home}/settings.xml
action.key = ${const:java.awt.event.KeyEvent.VK_CANCEL}
java.home = ${env:JAVA_HOME}
现在,我可以将所需的依赖项添加到我的Maven项目中
<dependency><groupId>commons-configuration</groupId><artifactId>commons-configuration</artifactId><version>1.10</version>
</dependency>
在jboss.server.config.dir
之前设置前缀sys:
<system-properties><property name="exporting.service.config.file" value="${sys:jboss.server.config.dir}\exporting\exporting-service.properties"/>
</system-properties>
并编写以下代码
import org.apache.commons.configuration.SystemConfiguration;...SystemConfiguration systemConfiguration = new SystemConfiguration();
String globalConfigFile = systemConfiguration.getString("exporting.service.config.file");
...
我笔记本上的字符串globalConfigFile
的值为C:\Development\Servers\jboss-as-7.1.1.Final\standalone\configuration\exporting\exporting-service.properties
。 前缀sys:
将变量标记为系统属性。 Commons Configuration将搜索具有给定名称的系统属性,并将变量替换为其值。 完整的代码:
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.SystemConfiguration;...PropertiesConfiguration propertiesConfiguration = new PropertiesConfiguration();
SystemConfiguration systemConfiguration = new SystemConfiguration();
String globalConfigFile = systemConfiguration.getString("exporting.service.config.file");
if (globalConfigFile != null) {try { propertiesConfiguration.setDelimiterParsingDisabled(true); propertiesConfiguration.load(globalConfigFile);} catch (ConfigurationException e) {LOG.log(Level.INFO, "Cannot read global properties");}
}
任何单个属性都可以读取,例如
propertiesConfiguration.getString("someKey")
propertiesConfiguration.getString("someKey", someDefaultValue)
propertiesConfiguration.getBoolean("someKey")
propertiesConfiguration.getBoolean("someKey", someDefaultValue)
propertiesConfiguration.getInteger("someKey")
propertiesConfiguration.getInteger("someKey", someDefaultValue)
usw。 就这样。 让我知道是否知道使用变量插值读取属性的另一种简单方法。
翻译自: https://www.javacodegeeks.com/2015/04/a-way-to-read-properties-with-variable-interpolation.html
静态变量读取属性文件