使用属性文件和 Maven 配置文件外部化 Web 应用程序配置的最佳方式
Best Way to Externalize Web App Config using Properties file and Maven Profiles
有一个 Java Maven 网络应用程序,它在以下配置文件中设置了硬编码属性:
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
问题:
- 有没有办法将配置文件外部化,这样我就不必在每次重新 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 中明确设置?
- 有没有办法使用 Maven 配置文件功能来切换配置属性?
例如
maven clean -install -p dev
maven clean -install -p prod
如何配置 pom.xml 文件以反映问题 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>
没有人知道问题 # 2 的答案吗?
有没有办法使用 Maven 配置文件功能来切换配置属性?
例如
maven clean -install -p dev
maven clean -install -p prod
可以使用资源过滤,见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
有一个 Java Maven 网络应用程序,它在以下配置文件中设置了硬编码属性:
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
问题:
- 有没有办法将配置文件外部化,这样我就不必在每次重新 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 中明确设置?
- 有没有办法使用 Maven 配置文件功能来切换配置属性?
例如
maven clean -install -p dev
maven clean -install -p prod
如何配置 pom.xml 文件以反映问题 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>
没有人知道问题 # 2 的答案吗?
有没有办法使用 Maven 配置文件功能来切换配置属性?
例如
maven clean -install -p dev
maven clean -install -p prod
可以使用资源过滤,见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