Spring 3.1中的默认配置文件

时间:2012-04-06 09:11:25

标签: java spring profiles

在我的应用程序中,我使用@Profile("prod")@Profile("demo")注释了bean。 第一个,正如你可以猜到:),用于连接到生产数据库的bean,第二个用于注释使用一些假数据库(HashMap或其他)的bean - 以加快开发速度。

我想要的是默认配置文件("prod"),如果它未被“ something-else ”覆盖,它将永远使用。

完美将是我的web.xml

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>prod</param-value>
</context-param>

然后使用-Dspring.profiles.active="demo"覆盖它,以便我可以执行:

mvn jetty:run -Dspring.profiles.active="demo". 

但遗憾的是这不起作用。任何想法我怎么能得到那个?在我的所有环境中设置-Dspring.profiles.active="prod"都不是一种选择。

7 个答案:

答案 0 :(得分:110)

将您的生产环境定义为web.xml中的默认配置文件

<context-param>
   <param-name>spring.profiles.default</param-name>
   <param-value>prod</param-value>
</context-param>

如果您想使用其他配置文件,请将其作为系统属性传递

mvn -Dspring.profiles.active="demo" jetty:run

答案 1 :(得分:65)

我的经验是使用

@Profile("default")

如果没有识别出其他配置文件,则只会将bean添加到上下文中。如果您传入不同的个人资料,例如-Dspring.profiles.active="demo",此个人资料将被忽略。

答案 2 :(得分:5)

您也可以考虑删除PROD配置文件,并使用@Profile(&#34;!demo&#34;)

答案 3 :(得分:5)

我有同样的问题,但我使用WebApplicationInitializer以编程方式配置ServletContext(Servlet 3.0+)。所以我做了以下几点:

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext sc) throws ServletException {
        // Create the 'root' Spring application context
        final AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        // Default active profiles can be overridden by the environment variable 'SPRING_PROFILES_ACTIVE'
        rootContext.getEnvironment().setDefaultProfiles("prod");
        rootContext.register(AppConfig.class);

        // Manage the lifecycle of the root application context
        sc.addListener(new ContextLoaderListener(rootContext));
    }
}

答案 4 :(得分:3)

关于设置已发布的默认生产资料@andih

为maven jetty插件设置默认配置文件的最简单方法是在插件配置中包含以下元素:

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <configuration>
        <systemProperties>
            <systemProperty>
                <name>spring.profiles.active</name>
                <value>demo</value>
            </systemProperty>
        </systemProperties>
    </configuration>
</plugin>

答案 5 :(得分:2)

Spring在确定哪些配置文件处于活动状态时提供两个单独的属性:

  • spring.profiles.active

  • spring.profiles.default

如果设置了spring.profiles.active,则其值确定哪些配置文件处于活动状态。但如果spring.profiles.active未设置,则Spring会查看spring.profiles.default.

如果既没有设置spring.profiles.active也没有设置spring.profiles.default,那么就没有活动的配置文件,只创建那些未被定义为在配置文件中的bean。任何没有的bean指定个人资料属于default个人资料。

答案 6 :(得分:-1)

您可以将web.xml设置为已过滤的资源,并将maven从maven配置文件设置中填充此值 - 这就是我们所做的。

在pom中过滤所有资源(如果你没有$ {}标记,你可以做到这一点)

<webResources>
    <resource>
        <directory>src/main/webapp</directory>
        <filtering>true</filtering>
    </resource>
</webResources>

在web.xml中放

<context-param>
     <param-name>spring.profiles.active</param-name>
     <param-value>${spring.prfile}</param-value>
</context-param>

在pom中创建maven个人资料

<profiles>
    <profile>
        <id>DEFAULT</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profile>prod</spring.profile>
        </properties>
    <profile>
    <profile>
        <id>DEMO</id>
        <properties>
            <spring.profile>demo</spring.profile>
        </properties>
    <profile>
</profiles>

现在你可以使用

mvn jetty:run -P DEMO

或只是-P DEMO使用任何maven命令