Java 管理配置数据的最佳方式是什么
我正在开发一个包含4种产品的产品套件。目前,所有配置数据都在XML或属性文件中。这种方法是不可维护的,因为我们必须为不同的环境(例如生产、开发等)管理不同的配置文件 那么,处理配置数据的最佳方法是什么? 另外,我们可以将其模块化为单独的模块吗?使所有产品都能使用此模块。 我们不想使用属性文件。我正在寻找一种解决方案,在该解决方案中,我们可以将所有特定于配置的代码作为新的配置模块移动,并将所有配置数据保存在数据库中。使用统一的API来访问属性,无论属性是如何表示的-。属性、xml、JNDI等。例如:Java 管理配置数据的最佳方式是什么,java,configuration-management,modularity,Java,Configuration Management,Modularity,我正在开发一个包含4种产品的产品套件。目前,所有配置数据都在XML或属性文件中。这种方法是不可维护的,因为我们必须为不同的环境(例如生产、开发等)管理不同的配置文件 那么,处理配置数据的最佳方法是什么? 另外,我们可以将其模块化为单独的模块吗?使所有产品都能使用此模块。 我们不想使用属性文件。我正在寻找一种解决方案,在该解决方案中,我们可以将所有特定于配置的代码作为新的配置模块移动,并将所有配置数据保存在数据库中。使用统一的API来访问属性,无论属性是如何表示的-。属性、xml、JNDI等。例如
config.properties
:
jdbcHost=192.168.12.35
jdbcUsername=dbuser
jdbcPassword=pass
config.xml
:
<config>
<jdbcHost>192.168.12.35</jdbcHost>
<jdbcUsername>dbuser</jdbcUsername>
<jdbcPassword>pass</jdbcPassword>
</config>
你就快到了。。。我将保留您的相同方法,并为应用程序实例引入正确的配置文件,该应用程序实例通过类似于以下方法之一的方法运行:
- 生产属性
- developer1.properties
- developer2.properties
- YOURAPP\u CONFIG\u DIR/server\u CONFIG.xml
- YOURAPP\u CONFIG\u DIR/database\u CONFIG.properties
我甚至在同一个项目中使用了这些方法的组合(1用于构建过程配置,2用于运行时配置)。对于我们所有的环境,配置数据以属性文件的形式存在于目标机器上。我们使用SpringFramework将这些属性绑定到我们的应用程序,以保持在不同环境中的可移植性 例如,只要我知道/etc/myapp/database.properties将出现在运行我的应用程序的任何机器上,那么在我的spring配置中,我只需要这样的东西:
<bean id="myPropertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/etc/myapp/database.properties</value>
</list>
</property>
</bean>
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://${db.host}:3306/${db.name}" />
<property name="username" value="${db.user}" />
<property name="password" value="${db.pass}" />
</bean>
/etc/myapp/database.properties
对于Spring类,有一系列关于属性文件所在位置的选项。您甚至可以将它们替换并作为环境变量传入:
<bean id="myPropertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="searchSystemEnvironment" value="true" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="locations">
<list>
<value>${database.configuration.file.url}</value>
</list>
</property>
</bean>
${database.configuration.file.url}
在bash_简介中(或其他内容):
导出JAVA_OPTS=“-Ddatabase.configuration.file.url=file:///etc/myapp/database.properties"
或者,在调用“java”时,根据您正在做的事情传入相同的-D选项
FWIW,我们将属性文件单独作为RPM进行维护。如果您的应用程序使用数据库,您可以创建一个“配置”表,如下所示:
create table configuration (mode char(3), key varchar(255), value varchar(1023));
您可以使用init脚本初始化它,比如init.sql,其内容如下:
insert into configuration values ('pro', 'param1', 'value1'); -- production
insert into configuration values ('dev', 'param1', 'value1'); -- development
insert into configuration values ('tst', 'param1', 'value1'); -- testing
...
这种方法的好处如下:
create table configuration (mode char(3), key varchar(255), value varchar(1023));
- 您可以将脚本与 你的代码
- 您可以轻松地扩展它以包括 按用户或按组设置 添加用户/组id
- 您可以在以下位置更改设置: 运行时,如果您需要这样做
- 您可以使用相同的堆栈(JPA+ DAO、Cayenne……)您通常用于 将核心应用程序数据处理到 处理配置数据
- 构建单个工件并将配置部署到单独的位置。工件可以有占位符变量,并且在部署时可以读入配置。查看弹簧特性占位符。对于使用Spring的网络应用程序来说,它工作得非常好,而且不涉及操作
- 具有位于webapp之外的外部化属性配置。保持位置不变,并始终从属性配置中读取。在任何阶段更新配置,重新启动将更新新值
- 如果您正在修改环境(即正在使用的应用程序服务器或用户/组权限),请考虑在puppet或chef中使用上述方法。还可以看看如何使用这些工具管理配置文件
- 有很多不同的策略。所有这些都很好,这取决于什么最适合你
这里有一个简单愚蠢的解决方案 代码段,尝试首先使用当前目录中的属性文件。如果失败,请改用资源目录(或jar文件)中的属性文件
环境变量几乎是最简单的方法。像其他任何时候一样设置它们,通过系统访问它们。getenv(“…”是一种配置文件管理工具。您可以创建在所有环境中通用的配置,也可以创建特定于环境的配置。您可以继续使用XML和属性文件,并让Config维护环境中的差异。您可以将Config视为您的集中式数据库,它可以以您想要的格式输出配置文件。无论何时需要配置文件,只要将其从配置部署(推或拉)到所需位置即可。请注意,我是配置团队的一员。我不确定是否理解有关模块的问题?我们不希望将配置数据保留在属性或xml文件中。我们希望将这些数据集中在数据库中。因此,我想在我们的应用程序中创建一个单独的模块,它将处理所有的配置内容。在我看来,您似乎已经决定不使用属性文件,因为您没有告诉我们。您能告诉我们为什么希望数据库维护配置文件吗?您仍然需要一些外部的东西来管理属性
Properties configFile = new Properties();
try {
configFile.load(new FileInputStream("production.properties"));
} catch (Exception e) {
System.err.println("Can not read properties, try to use default properties file.");
configFile.load(this.getClass().getClassLoader().
getResourceAsStream("development.properties"));
}