同一台服务器上的不同属性文件

Different properties files on the same server

我们有一个数据库库,可以从属性文件中获取连接信息(用户、主机等)。此文件可以是位于类路径中的 config.properties 文件,或位于执行 jar 旁边,或者可以作为参数传递 -Dproperties=/path/to/myConfig.properties.

我们还有几个应用程序使用这个库,所以每个应用程序都有自己的 config.properties 文件用于自己的执行。

但现在我正在创建两个使用相同库的 Web 应用程序。因此,如果我将它们部署在 Tomcat(war 文件)中,我有两个选择(据我所知):

1.- 将每个配置包含在 WAR 文件中。但是有了这个,每次我需要在 config.properties 中调整一些东西时,我都必须重新打包 war.

2.- 传递 -Dproperties 参数作为 Tomcat 的执行参数。但是不同的 war 部署必须共享相同的属性文件。

有解决办法吗?

我可以将 -D 参数传递给 Tomcat(或任何其他服务器)中的特定部署吗?

PS:这是我们的场景之一,但不限制数据库连接信息。我们还有其他库通过 config.properties 文件获取参数。

编辑:我希望能够为每个部署提供不同的config.properties文件。他们之间共享的属性不同。

我想我找到了一种在应用程序内部使用自包含网络服务器的方法,例如 Jetty。

我们有一个类似的要求,我们在部署到 JBoss EAP 服务器的不同应用程序之间共享一个公共 属性 文件。

在$JBOSS_HOME/bin/standalone.conf文件中可以添加配置文件路径如下:

JAVA_OPTS="$JAVA_OPTS -DCONFIG_LOCATION=/external/config/configuration.properties"

使用上面指定的 属性 启动服务器,在您的应用程序中,您可以使用 apache commons-configuration api 读取此 属性 文件,如下所示:

 try {
                props = new PropertiesConfiguration(System.getProperty("CONFIG_LOCATION"));
                FileChangedReloadingStrategy strategy = new FileChangedReloadingStrategy();
                // Delay 30s
                // strategy.setRefreshDelay(30000);
                props.setReloadingStrategy(strategy);

            } catch (ConfigurationException e) {
                e.printStackTrace();
            }

使用此重新加载策略,您可以在服务器 运行 时更改属性。您还可以指定一个时间间隔,在该时间间隔之后,外部文件中指定的所有属性都需要在您的应用程序中刷新而不弹出它。希望这对您有所帮助!

您可以创建一个环境变量,其值将是属性文件所在的路径。稍后使用此环境变量将为 属性 占位符配置创建 bean。

对于 UNIX,您可以在 bash 配置文件中添加

export CONF_DIR=/path/to/conf

然后在 spring 上下文文件中,添加此

<context:property-placeholder
  location="file:///${CONF_DIR}/path/myConfig1.properties,
  file:///${CONF_DIR}/path/myConfig2.properties"
  properties-ref="applicationDefaultProperties" ignore-resource-not-found="false"
  ignore-unresolvable="false"/>

因此,当您想要更改属性文件中的任何内容时,您可以在一个位置进行更改,然后重新启动应用程序以将新值加载到您的应用程序中。

所以,如果你的配置文件是这个

db.user=username
db.password=password

在javaclass里面,你可以像这样使用按键

@Value("${db.user")
private String username;

@Value("${db.password")
private String password; 

我找到的解决方案是在我的应用程序中使用嵌入式 Web 服务器。就我而言,我使用的是 Jetty。

现在我将我的应用程序打包为可执行 jar,并将系统参数作为 -D 参数传递,它们位于应用程序实例中。 像这样:

java -Dproperties=config.properties -jar java_app_with_embedded_server.jar