我试图升级一些旧版应用程序的库,其中部分内容正从第3季度升级到第4.1.6版。我认为这是一个非常典型的配置,使用Maven来引入依赖关系,然后使用maven配置文件和过滤来选择正确的属性文件来运行应用程序。看起来像这样。
pom.xml
<profiles>
<profile>
<id>dev</id>
<properties>
<app.env>Development</app.env>
</properties>
<build>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<webResources>
<webResource>
<directory>${basedir}/src/main/webapp/WEB-INF</directory>
<includes>
<include>web.xml</include>
</includes>
<filtering>true</filtering>
<targetPath>WEB-INF</targetPath>
</webResource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
</profile>
我的spring应用程序上下文位于带有PropertySourcesPlaceholderConfigurer bean定义的已过滤资源目录中。 $ {app.env}被过滤掉,由Development.properties文件加载
ApplicaitonContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="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">
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:com/tms/edu/settings/${app.env}.properties</value>
</list>
</property>
</bean>
我在这一点上的理解是,当使用ProperySourcesPlaceholderConfigurer而不是旧的PropertyPlaceHolderConfigurer时,它应该自动将资源注册为PropertySource,以便自动装配的Environment对象可以简单地调用getProperty(&#34; db .location&#34;)并在运行时提供。所以我应该能够在我的扫描包中有一个简单的类,基本上可以这样做:
@Service
public class PropertyReader {
@Autowired
private Environment env;
public String getPropertyValue(String key) {
return env.getProperty(urlkey);
}
}
然而,这并不起作用。 getProperty()为一个应该工作的键返回null,并检查调试器中的环境对象我没有看到我的资源加载到propertySources列表中。
我只是找到了如何使用注释配置PropertySource的示例,但这并不能解决我们如何在maven构建中管理配置文件和属性的问题。我知道我可以使用@Value $ {}样式注释来获取这些值并且工作正常。但我仍然很好奇为什么环境不像我期望的那样工作。
答案 0 :(得分:0)
如果您使用的是XML配置,请尝试添加<context:property-placeholder location="classpath:foo.properties" />
或
<context:property-placeholder location="classpath:${app.env}.properties"/>
?
相当于@PropertySource("classpath:whatever.properties")
此命名空间启用PropertySources,请参阅here on "Using the @Value annotation"
注意:classpath
可以直接引用resources
文件夹,这是将您的属性设置为Maven项目的正常位置