100

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

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

完美的将是在我的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"不是一个选项。

4

7 回答 7

111

在 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
于 2012-04-06T09:50:18.613 回答
68

我的经验是使用

@Profile("default")

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

于 2012-08-28T21:50:49.690 回答
6

我有同样的问题,但我使用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));
    }
}
于 2015-12-02T11:08:09.907 回答
5

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

于 2014-05-05T11:31:52.720 回答
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>
于 2014-01-11T20:22:43.473 回答
3

在确定哪些配置文件处于活动状态时,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配置文件。

于 2017-01-26T15:06:09.133 回答
-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 命令

于 2012-04-06T10:05:56.590 回答