我正在尝试从wildfly配置文件夹中的属性文件中读取特定于部署的信息。我试过这个:
@Singleton
@Startup
public class DeploymentConfiguration {
protected Properties props;
@PostConstruct
public void readConfig() {
props = new Properties();
try {
props.load(getClass().getClassLoader().getResourceAsStream("my.properties"));
} catch (IOException e) {
// ... whatever
}
}
但是很明显,由于配置文件夹不在类路径中,所以这不起作用。现在我找不到一个简单的方法。我最喜欢的是这样:
@InjectProperties("my.properties")
protected Properties props;
到目前为止,我在web上找到的唯一解决方案是制作自己的osgi模块,但我相信一定有更简单的方法(没有osgi的方法!)。有人能告诉我怎么做吗?
7条答案
按热度按时间sc4hvdpw1#
下面是一个使用cdi的完整示例,来自这个站点。
在wildfly配置文件夹中创建并填充属性文件
向wildfly配置文件添加系统属性。
这将向服务器配置文件(standalone.xml或domain.xml)添加以下内容:
创建加载和存储应用程序范围属性的单例会话bean
创建cdi限定符。我们将在希望注入的java变量上使用这个注解。
创建生产者方法;这将生成要注入的对象
最后,将属性注入一个cdibean
3phpmpom2#
如果要从配置目录显式读取文件(例如。
$WILDFLY_HOME/standalone/configuration
或者domain/configuration
)有一个包含路径的系统属性。简单地做System.getProperty("jboss.server.config.dir");
并将您的文件名附加到该文件以获取该文件。你不会把它当作资源来读,所以。。。
然后文件将为您加载。
另外,由于wildfly不再提供osgi支持,我不知道创建osgi模块会对您有什么帮助。
7ajki6be3#
为了避免这种问题,问题是设置
jboss.server.config.dir
在类似的vm参数中:x8goxv8g4#
如果在standalone.xml属性中有:
你可以通过以下方式阅读:
或者在web.xml中指定context param,例如:
您可以在java bean中阅读:
nwlls2ji5#
gg58donl6#
听起来您试图解决的问题是管理不同(但可能相似)的配置文件,以便在不同的环境(即生产环境、qa环境,甚至不同的客户)中运行应用程序。如果是这样的话,看看jfighttp://jfig.sourceforge.net/ . 它将消除在类路径之外存储属性文件的需要(但仍然可以)。
我们需要的是配置文件的分层方法。90%不变的配置值可以保存在基本文件中。其他百分之十(或更少)可以保存在他们自己独特的配置文件中。在运行时,这些文件彼此层叠,以提供灵活、可管理的配置。例如,在开发环境中,myhost.config.xml与dev.config.xml和base.config.xml组合在一起形成我的唯一配置。
然后可以在版本控制中维护每个配置文件,因为它们具有唯一的名称。当基值更改时,只需要修改基文件,很容易看出版本之间的差异。另一个主要好处是,对基本配置文件的更改将在部署之前进行彻底的测试。
sqougxex7#
你能做的最简单的事就是跑步
standalone.sh
用一个-P
选项引用您的属性文件(您需要一个urlfile:/path/to/my.properties
,或将文件放入$WILDFLY_HOME/bin
).然后文件中的所有属性将作为系统属性加载。
要将配置属性注入到应用程序类中,请查看deltaspike配置,它支持不同的属性源,如系统属性、环境变量、jndi条目,并对应用程序隐藏特定的源。
或者,为了避免设置系统属性(对于部署到wildfly示例的所有应用程序来说,这些属性都是全局的),您还可以为deltaspike定义一个自定义属性源,以便从任何给定位置读取属性文件,并且这些属性将是应用程序的本地属性。