【发布时间】:2017-06-08 00:15:14
【问题描述】:
我有一个 webapp,它是一个 RestEASY JAX-RS 应用程序,它使用最新的 servlet 规范,例如 Java EE 注释,因此我不需要创建 web.xml 文件。
webapp 捆绑为foobar.war 并转储到Tomcat 中的webapps 目录中。事实上,同一个 foobar.war 在同一个 Tomcat 实例中部署了两次,一次是 foobar.war,另一次是 foobar#demo.war(如您所知,它映射到 foobar/demo)。
我通过放置 conf/Catalina/localhost/foobar.xml 和 conf/Catalina/localhost/foobar#demo.xml 文件来配置每个已安装的 webapp,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Environment name="foo" type="java.lang.String" value="bar"/>
</Context>
在我的 JAX-RS 应用程序中,我使用 java:comp/env/foo 从 JNDI 中提取 foo 的值。
所以现在我添加了一个名为 FooBarConfiguration 的基于 Java 的 Spring 配置。我使用new AnnotationConfigApplicationContext(FooBarConfiguration.class) 将它加载到我的JAX-RS 应用程序中。一切正常。
所以现在我向FooBarConfiguration 添加了两个配置文件,一个名为foo,一个名为bar。但是现在......我如何告诉 webapp 使用哪个 Spring 配置文件? (记住我没有web.xml 文件。)显然我必须在某个地方设置spring.profiles.active。但是在哪里?
因为文档提到了“环境”和“JNDI”,所以我交叉手指向conf/Catalina/localhost/foobar.xml 添加了一个环境变量:
<Environment name="spring.profiles.active" type="java.lang.String" value="foo"/>
运气不好。
我无法设置系统属性,因为这将适用于所有 webapps,这里的想法是每个foobar.war 实例(foobar.war 和foobar#demo.war)都可以指定了不同的配置文件。
我想我可以自己手动将其从 Tomcat 环境中拉出,使用 java:comp/env/spring.profiles.active,但是我在哪里设置值? (我想也许AnnotationConfigApplicationContext 会有一个构造函数,我可以在其中设置配置文件,或者至少有一个配置文件设置,但这似乎也不见了。)
(另外,如果我手动从 JNDI 中提取设置并自己设置,我还不如切换到更轻量级的 Guice 并手动加载我想要的模块。我只使用庞大、笨重的 Spring,因为它承诺允许轻松选择配置文件。)
如何在我的 WAR 文件之外,在每个 webapp 的基础上指出我正在使用哪个 Spring 配置文件?
【问题讨论】:
标签: java spring tomcat jax-rs spring-profiles