【问题标题】:Different properties files on the same server同一服务器上的不同属性文件
【发布时间】:2018-02-06 15:49:37
【问题描述】:

我们有一个从属性文件中获取连接信息(用户、主机等)的数据库库。该文件可以是位于类路径中的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 文件。它们之间共享的属性不同。

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

【问题讨论】:

  • 你能修改加载属性的共享库吗?如果是,添加对可选属性前缀的支持。例如,war 1 使用前缀“app1”,war 2 使用前缀“app2”。在共享属性文件中:app1.database.url=...app2.database.url=...
  • 是的,我可以修改库。问题是,该库并非特定于 Web 应用程序(其他 java 项目可能会使用它),并且 Web 应用程序的数量可能会增加,所以如果我理解您的方法,它将为“消费者”Web 应用程序量身定制。 @AndrewS
  • 是的 - 共享库的使用者需要一种方法来设置前缀或注入带有前缀的实例。

标签: java tomcat war


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-09
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        • 2013-01-31
        • 2016-11-28
        • 2015-12-08
        • 1970-01-01
        相关资源
        最近更新 更多