Spring 3.1中的默认配置文件


100

在我的应用程序中,我有用@Profile("prod")和注释的bean @Profile("demo")。您可以猜到:)第一个用于连接到生产数据库的bean,第二个注释使用伪造的DB(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"我无法在所有环境上进行设置。

Answers:


67

我的经验是

@Profile("default")

仅当未标识其他概要文件时,才会将Bean添加到上下文。如果您传入其他配置文件,例如-Dspring.profiles.active="demo",则该配置文件将被忽略。


4
可接受的答案取决于web.xml(这很好),但是无论您是否具有web.xml,此答案都有效,因此对每个人都更有用。
周杰伦2015年

1
此解决方案更干净
cahen 2015年

这是官方功能还是有些副作用?您想链接到描述此功能的Spring文档吗?
rustyx

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

3
不,他试图在web.xml 中将活动配置文件定义为系统属性。在我的解决方案中,我在web.xml中配置默认配置文件,并通过系统属性覆盖/定义活动配置文件。如果没有显式的活动配置文件,则将使用默认配置文件。
andih 2012年

1
谢谢!这正是我想要的!/:不能在任何地方找到它
米哈尔Margiel

这种方法的一个问题:如果设置spring.profiles.default=prodapplication.properties,则application-prod.properties不会加载。这是违反直觉的。
gamliela

@gamliela该方法未在文件中设置默认配置application.properties文件。为了知道application-prod.properties应该使用的内容,您必须了解配置文件。这就是这种方法的作用。它web.xml通过(默认)或通过环境变量(覆盖默认值)在spring上下文之外定义配置文件。
andih '16

@andih是的,我知道,但是我只说这不直观,因此存在问题。由于已application-default.properties加载,因此我也希望application-newdefault.properties将其加载。这不是您的解决方案的问题,而是Spring的问题...
gamliela

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));
    }
}

5

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


2
我想如果您有两个以上的个人资料,这将不起作用,对吗?
印章

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>

3

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

  • spring.profiles.active

  • spring.profiles.default

如果spring.profiles.active设置为,则其值确定哪些配置文件处于活动状态。但是如果spring.profiles.active没有设置,那么Spring看起来会spring.profiles.default.

如果没有spring.profiles.active,也没有spring.profiles.default设置,那么有没有被定义为一个配置文件是没有作用轮廓,只有那些豆created.Any豆不指定配置文件所属的default配置文件。


-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命令


1
我不确定,但我认为这行不通。恕我直言jetty:run将不会在其中过滤资源的运行阶段。
米哈尔Margiel

的原因,您需要运行mvn clean编译jetty:run -P DEMO,但是使用未编译的代码,它将自动运行它
Hurda'4

10
我知道Spring 3.1 Profiles的主要目标之一是生成一个准备在所有环境中部署的WAR文件。使用Maven配置文件是回到上一个状态的一步:每个环境都需要打包WAR文件...
edrabc 2012年

@edrabc,他要求mvn jetty:run-没有WAR文件。
赫尔达

同意@Hurda。但是他还要求在多个环境中运行该命令:混合使用Maven配置文件和Spring配置文件可能会引起误解……
edrabc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.