我有一个Spring 4 MVC应用程序,我想从命令行传入环境(配置文件)并让它在启动时读取正确的特定于环境的.properties
文件。
这些属性文件基本上包含不同的jdbc
连接字符串,因此每个环境都可以连接到正确的数据库。
我一般都在学习Spring和Java,所以很难搞清楚这一点。
在web.xml
中我定义了3个环境/配置文件
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>test, dev, prod</param-value>
</context-param>
我在资源目录下有3个特定于环境的文件。我的理解是,Spring将尝试使用适当的环境特定文件和一个通用application.properties
文件(如果存在,并且不在此处)来依赖。
> \ls src/main/webapp/resources/properties/
application-dev.properties application-prod.properties application-test.properties
每个文件都非常简单,只是该环境的jdbc连接参数。例如:
jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/galapagos
jdbc.username=foo
jdbc.password=
最后在我的servlet文件spring-web-servlet.xml
中,我读取了应用程序属性文件并用它来建立连接
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
....
<!-- Database / JDBC -->
<beans:bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<beans:property name="location" value="resources/properties/application.properties" />
</beans:bean>
<beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<beans:property name="driverClassName" value="${jdbc.driverClassName}" />
<beans:property name="url" value="${jdbc.url}" />
<beans:property name="username" value="${jdbc.username}" />
<beans:property name="password" value="${jdbc.password}" />
</beans:bean>
....
</beans:beans>
这是错误的,因为它试图寻找不存在的resources/properties/application.properties
。但我不确定还有什么可以放在那里。如何让它在启动时动态读取正确的环境文件?
我看到了一些使用上下文监听器的示例like this one,但说实话,我还在学习Spring MVC并且并不真正理解那些想要做的事情
谢谢!
答案 0 :(得分:0)
默认情况下,spring会尝试查找resources/properties/application.properties
来加载属性。此文件是自动检测的。
这是你的问题,你必须提供一个。如果您不想拥有application.properties文件,可以通过使用spring.config.name
环境属性指定spring.config.location
环境属性及其位置来覆盖它的名称。
在web.xml
,
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>test, dev, prod</param-value>
</context-param>
您正在同时激活3个配置文件。我建议您在application.properties
中定义哪个配置文件已激活。例如:
spring.profiles.active=dev
然后,将加载特定的环境文件,并将优先于默认属性文件。