gpt4 book ai didi

java - JavaEE 中的配置管理

转载 作者:搜寻专家 更新时间:2023-10-31 08:03:58 24 4
gpt4 key购买 nike

我的目标

我有一个 JavaEE 环境(在我的特定情况下,它是一个 Glassfish Web 配置文件),我想要一种独立于容器的方式来配置我的具有以下功能的应用程序:

  1. 未指定任何其他内容时的默认配置(在 WAR 文件中)
  2. 两层自定义配置(WAR 文件之外):
    • 主机特定设置(在外部属性文件中;例如一些工作目录)
    • 特定于应用程序的设置(在数据库中;例如邮箱大小)

我希望有尽可能少的先决条件(现在唯一的一个是 JNDI 数据源)来部署和运行我的应用程序(设置 JNDI 数据源,部署 WAR 文件,在某些配置中有一个可选的 .properties 文件文件夹和 - 完成)。

这引出了我的第一个问题:这是一个常见/良好/有用的设置,还是不必要的复杂和/或非常奇特?

我的想法(到目前为止)

默认配置

默认配置在属性文件中:

src/main/resources/config/default.properties

应用程序范围的 bean 在初始化时读取此属性,如所述 here :

@Named
@ApplicationScoped
public class Configuration implements Serializable {

...

@PostConstruct
public void initConfiguration() {
loadDefaultConfiguration();
}

private void loadDefaultConfiguration() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

try (InputStream input = classLoader.getResourceAsStream("/config/default.properties")) {
properties.load(input);
} catch(IOException ex) {
LOGGER.error(...);
}
}

}

应用程序特定设置

这些设置将存储在具有键和值列的数据库表中。它们将始终通过 EntityManager 访问,希望 JPA 实现的缓存是聪明的 :)。这样做的好处是,可以在应用程序运行时轻松更改这些设置。

@Named
@ApplicationScoped
public class Configuration implements Serializable {

...

public T getProperty(final PropertyKeyEnum key, final Class<T> type) {
if (key.getSource() == PropertySourceEnum.DATABASE) {
return configurationDao.getByKey(key.getKey(), type);
}

...
}
}

主机特定设置

最后,这是我的主要问题:

如何以独立于容器的方式访问外部属性文件?用户应该能够将 myAppName.properties 文件放入容器的默认配置文件夹中,应用程序应该能够找到并加载该文件(至少在应用程序启动时)。

我的环境

  • JavaSE 7
  • JavaEE 6
  • Glassfish 3.1.2 Web(但这不重要;))

更新

我在 Glassfish 的管理区域找到了一个地方,您可以在其中指定一些易于访问的系统属性:

System.getProperty("myApp.propertyName");

这可用于存储外部 .properties 文件的路径,但我不确定这是否是一种干净的方式,因为

  1. 我不知道是不是每个容器(支持JavaEE)都有这么好的特性
  2. 我真的不想从网络应用程序普通访问文件

最佳答案

在与我的同事交谈并进行一些研究之后,我针对特定于主机的(外部)配置实现了以下内容。

因为我的应用程序无论如何都需要一个工作目录,所以我决定将这个工作目录也用作我的外部配置的位置。因此,我要么使用环境变量(例如 MYAPP_HOME ),要么如果未设置变量,则使用用户的主文件夹(例如 <user.home>/.myapp ):

private Path discoverRootDirectory() {
String myAppHome = System.getenv("MYAPP_HOME");

if (myAppHome == null) {
return Paths.get(System.getProperty("user.home"), ".myapp");
} else {
return Paths.get(myAppHome);
}
}

属性文件将照常加载:

private void loadConfiguration() {
properties = new Properties();
// ...
try (InputStream inputStream = Files.newInputStream(discoverRootDirectory())) {
properties.load(inputStream);
} catch (FileAccessException | IOException ex) {
// ...
}
}

关于java - JavaEE 中的配置管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12996093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com