Spring 3.1의 기본 프로필


100

내 응용 프로그램에는 @Profile("prod")및 주석이 달린 콩이 있습니다 @Profile("demo"). 짐작할 수 있듯이 첫 번째는 프로덕션 DB에 연결하는 Bean에 사용되며 두 번째 HashMap는 개발 속도를 높이기 위해 가짜 DB ( 또는 기타) 를 사용하는 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"내 모든 환경에서 설정 하는 것은 옵션이 아닙니다.

답변:


67

내 경험은

@Profile("default")

Bean은 다른 프로파일이 식별되지 않는 경우에만 컨텍스트에 추가됩니다. 예를 들어 다른 프로필을 전달하면 -Dspring.profiles.active="demo"이 프로필이 무시됩니다.


4
허용되는 대답은 web.xml에 따라 다르지만 (괜찮습니다)이 대답은 web.xml이 있는지 여부에 관계없이 작동하므로 모두에게 더 광범위하게 유용합니다.
Jay

1
이 솔루션은 매우 깨끗합니다
cahen

이것은 공식적인 기능입니까 아니면 부작용입니까? 이 기능이 설명 된 Spring 문서에 링크 하시겠습니까?
rustyx 2015-09-17

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

1
감사! 이것이 바로 내가 원했던 것입니다! 어디서든 찾을 수 없습니다 : /
마이클 Margiel

이 방법의 문제점 : 사용자가 설정 한 경우 spring.profiles.default=prodapplication.properties, 다음 application-prod.properties로드되지 않습니다. 이것은 반 직관적입니다.
gamliela

@gamliela 접근 방식은 application.properties파일에 기본 프로필을 설정하지 않습니다 . 이것이 application-prod.properties사용되어야한다는 것을 알기 위해서는 프로필을 알아야합니다. 이것이 바로이 접근법이하는 일입니다. web.xml(기본값) 또는 환경 변수를 통해 (기본값 덮어 쓰기) 스프링 컨텍스트 외부의 프로필을 정의합니다 .
andih

@andih 예, 알고 있지만 직관적이지 않아 문제가 있다고 말합니다. application-default.properties로드 된 이후에도 로드 application-newdefault.properties될 것으로 예상합니다 . 그것은 ... 그것은 봄에 문제가있어, 솔루션에 문제가 아니에요
gamliela

6

동일한 문제가 있지만 ServletContext를 프로그래밍 방식으로 구성하기 위해 WebApplicationInitializer 를 사용 합니다 (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
두 개 이상의 프로필이있는 경우에는 이것이 작동하지 않을 것이라고 생각합니다. 그렇죠?
Chop

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에서 모든 리소스를 필터링합니다 ($ {} 표시가 없으면 taht 할 수 있습니다)

<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 DEMOMaven 명령으로


1
잘 모르겠지만 작동하지 않을 것 같습니다. IMHO jetty : run은 리소스가 필터링되는 단계를 실행하지 않습니다.
Michał Margiel 2012

caurse의 경우 mvn clean compile jetty : run -P DEMO를 실행해야하지만 컴파일되지 않은 코드를 사용하면 자동으로 실행됩니다
Hurda

10
Spring 3.1 Profiles의 주요 목표 중 하나는 모든 환경에 배포 할 준비가 된 단일 WAR 파일을 생성하는 것임을 이해합니다. Maven 프로필을 사용하는 것은 이전 상태로 돌아가는 것입니다. 각 환경에 대해 WAR 파일의 패키징이 필요한 곳 ​​...
edrabc

@edrabc 그는 mvn jetty : run을 요청했습니다-WAR 파일이 없습니다.
Hurda

@Hurda에 동의합니다. 그러나 그는 또한 여러 환경에서 명령을 실행 요구했다 : 메이븐 프로필 및 봄 프로파일의 혼합을 가진 것은 오해의 소지가 조금 ... 수
edrabc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.