Java 管理配置数据的最佳方式是什么

Java 管理配置数据的最佳方式是什么,java,configuration-management,modularity,Java,Configuration Management,Modularity,我正在开发一个包含4种产品的产品套件。目前,所有配置数据都在XML或属性文件中。这种方法是不可维护的,因为我们必须为不同的环境(例如生产、开发等)管理不同的配置文件 那么,处理配置数据的最佳方法是什么? 另外,我们可以将其模块化为单独的模块吗?使所有产品都能使用此模块。 我们不想使用属性文件。我正在寻找一种解决方案,在该解决方案中,我们可以将所有特定于配置的代码作为新的配置模块移动,并将所有配置数据保存在数据库中。使用统一的API来访问属性,无论属性是如何表示的-。属性、xml、JNDI等。例如

我正在开发一个包含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"));
            }