我需要为我们的春季项目进行开发和生产设置。我知道你可以使用弹簧配置文件,但这不是我们可以做的事情。
我想要做的是在开发环境中放置一个test-application.properties文件,并在生产中放置一个prod-application.properties文件。在tomcat上下文定义中,我们发送了以下内容:
<Context>
<context-param>
<param-name>properties_location</param-name>
<param-value>file:C:\Users\Bill\test-application.properties</param-value>
</context-param>
</Context>
我们可以为生产服务器更改值。在spring配置中我们有类似的东西:
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations">
<list>
<value>${properties_location}</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="false" />
</bean>
但我们不断收到如下错误:
org.springframework.beans.factory.BeanInitializationException:可以 不加载属性;嵌套异常是 java.io.FileNotFoundException:无法打开ServletContext资源 [/ $ {properties_location}]
关于如何解决的任何想法?
答案 0 :(得分:8)
PropertyPlaceholder的一个功能是您可以定义多个资源位置。 例如,您可以定义 your-production-config.properties 以及文件:C:/ Users / $ {user.name} /test-application.properties
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:your-production-config.properties</value>
<value>file:C:/Users/${user.name}/test-application.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="ignoreResourceNotFound" value="true"/>
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
</bean>
对于生产你需要将prod配置放在某个地方的classpath中(确切地说,确切地说并不重要,只是类路径) - 对于本地环境,你可以像这个文件一样使用对话:C:/ Users / $ {user.name} / test- application.properties
答案 1 :(得分:2)
我最终通过不使用上下文参数来解决它。相反,我们定义了
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:application.properties</value>
<value>file:C:\Users\Bill\prod-application.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="ignoreResourceNotFound" value="true"/>
</bean>
这种方式尝试加载这两个文件。在测试服务器上,我们没有prod文件,因此未加载。在prod服务器上,prod-application.properties文件存在并覆盖类路径中的测试。繁琐但有效!
答案 2 :(得分:2)
<context:property-placeholder location="file:${catalina.home}/conf/myFirst.properties" ignore-unresolvable="true" />
<context:property-placeholder location="classpath:second.properties" ignore-unresolvable="true" />
我是这样做的。 catalina.home
变量允许在tomcat home conf目录中显示属性文件。
答案 3 :(得分:1)
就个人而言,尽量避免指定位置。我认为最好的办法是使用JNDI来实现这一目标。
在tomcat / conf / server.xml
中<Resource name="jdbc/prod" auth="Container"
type="javax.sql.DataSource" driverClassName="${database.driverClassName}"
url="${database.url}"
username="${database.username}" password="${database.password}"
maxActive="20" maxIdle="10"
maxWait="-1"/>
和在tomcat catalina.properties中(如果使用Oracle XE,则相应地更改它):
database.driverClassName=oracle.jdbc.driver.OracleDriver
database.url=jdbc:oracle:thin:@//localhost:1521/XE
database.username=user
database.password=password
在您的应用程序中,在名为jdbc.properties的类路径中创建属性文件并添加以下内容(如果使用Oracle XE,则相应地更改它)
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:user/password@//localhost:1521/XE
然后在Spring applicationContext.xml
<context:property-placeholder location="classpath:jdbc.properties" />
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/prod" />
<property name="defaultObject" ref="dataSourceFallback" />
</bean>
<bean id="dataSourceFallback" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="poolPreparedStatements">
<value>true</value>
</property>
<property name="maxActive">
<value>4</value>
</property>
<property name="maxIdle">
<value>1</value>
</property>
</bean>
答案 4 :(得分:0)
使用:
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations">
<list>
<value>C:/Users/Bill/test-application.properties</value>
</list>
</property>
<property name="ignoreUnresolvablePlaceholders" value="false" />
</bean>
从web.xml
<Context>
<context-param>
<param-name>properties_location</param-name>
<param-value>file:C:\Users\Bill\test-application.properties</param-value>
</context-param>
</Context>
答案 5 :(得分:0)
如果您使用Tcserver和server.xml配置数据库,队列等资源,则可以使用com.springsource.tcserver.properties.SystemProperties
在server.xml中Delcare这个监听器,如下所示
<Listener className="com.springsource.tcserver.properties.SystemProperties"
file.1="${catalina.base}/conf/password.properties"
file.2="${catalina.base}/conf/server.properties"
immutable="false"
trigger="now"/>
现在您可以将属性外部化为两个文件password.properties和server.properties。