【问题标题】:Best Way to Externalize Web App Config using Properties file and Maven Profiles使用属性文件和 Maven 配置文件外部化 Web 应用程序配置的最佳方法
【发布时间】:2017-11-28 17:04:13
【问题描述】:

拥有一个 Java Maven Web 应用程序,该应用程序在以下配置文件中设置了硬编码属性:

src/main/resources/database.xml

<beans xmlns="http://www.springframework.org/schema/beans">
      <bean id="aDatasource"  class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
      <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
      <property name="url"><value>jdbc:mysql://anIpAddress/mydatabase?zeroDateTimeBehavior=convertToNull</value></property>
      <property name="username"><value>root</value></property>
      <property name="password"><value>password</value></property>
   </bean> 
</beans>

src/main/resources/log4.j.properties

log4j.appender.RF.File=/opt/apache-tomcat-7.0.78/webapps/myapp/WEB-INF/classes/logs.log

在我运行 maven clean install 之前,我不断地通过替换内部 database.xml 来编辑这些文件:

aniPAddress with localhost
root with my local database's root user
password with my local database's root password

log4.properties 内部:

/opt/apache-tomcat-7.0.78/ with $CATALINA_HOME

问题:

  1. 有没有办法将配置文件外部化,这样我就不必在每次执行新的 Git 签出时都显式更改它?

例如

我是否应该在 src/main/resources 中创建一个包含以下属性的 application.properties 文件:

database.url = localhost
database.user = root
database.password = 
tomcat.home = $CATALINA_HOME or /etc/tomcat7/

如何在 database.xml 和/或 log4j.properties 中显式设置这些?

  1. 有没有办法使用 Maven 配置文件功能来切换配置属性?

例如

maven clean -install -p dev 
maven clean -install -p prod

如何配置 pom.xml 文件以反映问题 1 中所需的行为?

【问题讨论】:

  • 如果您使用的是 spring(根据您的 xml 判断),我真的不明白为什么您不能在 application.properties 中设置您的属性(就像您自己提到的那样)。然后您可以设置该配置的路径,例如 --spring.config.location=/loc/to/config/file。您甚至可以使用配置文件,例如:application-dev.pproperties 并将您的配置文件设置为 dev --spring.profiles.active=dev。

标签: java maven properties log4j properties-file


【解决方案1】:

找到了我的第一个问题的答案,关于如何根据外部属性在服务器启动时加载 Spring 数据源 database.xml:

就像把这个条目放在database.xml文件中一样简单:

<bean id="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="ignoreResourceNotFound" value="true" />
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="location" value="file:/proplocation/database.properties"></property>
</bean>

没有人知道 Queston #2 的答案吗?

有没有办法使用 maven 配置文件功能来切换配置属性?

例如

maven clean -install -p dev
maven clean -install -p prod

【讨论】:

    【解决方案2】:

    可以使用资源过滤,见https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html

    鉴于以下 pom:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>test</groupId>
        <artifactId>test</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <build>
            <resources>
                <resource>
                    <directory>${project.basedir}/src/main/filtered-resources</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <jdbc.url>localhost</jdbc.url>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <jdbc.url>server.prod</jdbc.url>
            </properties>
        </profile>
    </profiles>
    </project>
    

    以及文件src/main/filtered-resource/application.properties中的如下内容:

    database.url = ${jdbc.url}
    

    使用“mvn -Pdev process-resource”文件 target/classes/application.properties 将包含:

    database.url = localhost
    

    并使用“mvn -Pprod process-resource”:

    database.url = server.prod
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-07
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多