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

时间:2018-02-06 15:49:38

标签: java tomcat war

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

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

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

1.-在WAR文件中包含每个配置。但有了这个,每次我需要调整config.properties中的某些内容时,我都必须重新打包战争。

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

有解决方法吗?

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

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

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

我认为我找到了在应用程序中使用自包含Web服务器的方法,比如Jetty。

3 个答案:

答案 0 :(得分:0)

我们在类似的要求中,我们在部署到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();
            }

使用此重新加载策略,您可以在服务器运行时更​​改属性。您还可以指定在应用程序中刷新外部文件中指定的所有属性而不进行弹跳的时间间隔。希望这有帮助!

答案 1 :(得分:0)

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

在java类中,您可以像这样使用键

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

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

答案 2 :(得分:0)

我发现问题的解决方案是在我的应用程序中使用嵌入式Web服务器。就我而言,我正在使用Jetty。

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

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