我正在处理的应用程序有一个基于XML的Spring配置(框架版本:4.1.7.RELEASE)。
因为如果指定了配置文件,我想要实例化某些bean,我已将以下内容添加到web.xml
:
<servlet>
<servlet-name>my-app</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<!-- This part is new -->
<init-param>
<param-name>spring.profiles.active</param-name>
<param-value>${spring.profile}</param-value>
</init-param>
<!-- End of newly-added part -->
<load-on-startup>1</load-on-startup>
</servlet>
spring.profile
是Maven pom.xml中设置的属性,基于所选的Maven配置文件:
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.profile>development</spring.profile>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<spring.profile>production</spring.profile>
</properties>
</profile>
</profiles>
我在maven-war
插件中启用了过滤功能,该插件按预期工作,因为占位符会根据所选的Maven配置文件替换为适当的值。因此,涉及Maven的部分被清除并且工作正常。
但是,当我尝试注入一个Environment实例时,活动配置文件列表为空:
@Autowired private Environment env;
...
log.info(env.getActiveProfiles().toString());
servletConfigInitParams
显示在Environment
的属性来源列表中,但似乎只是忽略了我的init-param
。
我设法通过在两个maven配置文件中提供实际系统属性并使用这些设置运行来设置Spring配置文件,但这不是生产环境的可行解决方案,也不是通过命令行提供这些。
谁能说出我做错了什么?