복붙노트

[SPRING] Maven 프로파일로 스프링 활성 프로파일을 설정하는 방법

SPRING

Maven 프로파일로 스프링 활성 프로파일을 설정하는 방법

빌드 도구로 maven을 사용하는 응용 프로그램이 있습니다.

나는 다른 프로필에서 다른 속성을 설정하기 위해 maven 프로필을 사용하고 있습니다.

내가 뭘하고 싶은지 메이븐에있는 모든 활성 프로필뿐만 아니라 나는 (@profile) 콩 서명에서 그들을 참조 할 수있는 봄 활성 프로필로 이식됩니다. 하지만 어떻게해야할지 모르겠다.

예를 들면 다음과 같습니다.

<profiles>
    <profile>
        <id>profile1</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
        </properties>
    </profile>
    <profile>
        <id>profile2</id>
        <properties>
        </properties>
    </profile>
    <profile>
        <id>development</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
        </properties>
    </profile>
    <profile>
        <id>production</id>
        <properties>    
        </properties>
    </profile>
</profiles>

내가 프로필을 가지고 있고 프로파일을 활성 프로필로 가지고 싶다면 다른 프로필을 지정하지 않고 maven을 실행한다고 가정하십시오.

해결법

  1. ==============================

    1.응용 프로그램의 리소스 (예 : 속성 파일)를 필터링해야합니다.이 파일은 봄에 활성화 할 프로필의 정보를 보유합니다.

    응용 프로그램의 리소스 (예 : 속성 파일)를 필터링해야합니다.이 파일은 봄에 활성화 할 프로필의 정보를 보유합니다.

    예를 들어

    spring.profile = ${mySpringProfile}
    

    그리고 각 프로파일에 대해이 변수의 값 (mySpringProfile)을 정의하십시오.

    빌드 중에는 현재 활성 프로파일에 정의 된 값에 따라 필터링됩니다.

    그런 다음 응용 프로그램의 부트 스트랩 (bootstrap) 중에이 파일에 따라 적절한 프로필을 선택합니다 (더 많은 정보를 제공하지 않았으므로 더 많은 도움을 줄 수는 없지만 매우 쉽습니다.

    참고 : 현재 활성화 된 프로필을 maven에서 가져 오는 방법을 찾을 수 없습니다 (예 : -P 값을 포함하는 project.profiles.active와 같은). 그래서 각 프로필에 대해 새 변수를 설정해야합니다.

    참고 2 : 웹 응용 프로그램을 실행중인 경우이 중간 파일을 사용하는 대신 web.xml에서이 값을 필터링하십시오.

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

    참고 3 : 이것은 실제로 나쁜 습관이며 런타임에 프로필을 시스템 속성으로 설정해야합니다

  2. ==============================

    2.2 개의 Maven + 스프링 프로파일을 동시에 전환하는보다 우아한 방법이 있습니다.

    2 개의 Maven + 스프링 프로파일을 동시에 전환하는보다 우아한 방법이 있습니다.

    먼저, POM에 프로파일을 추가하십시오 (주의하십시오 - Maven + 스프링 프로파일은 단일 시스템 변수로 활성화됩니다) :

    <profiles>
        <profile>
            <id>postgres</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <property>
                    <name>spring.profiles.active</name>
                    <value>postgres</value>
                </property>
            </activation>
            <dependencies>
                <dependency>
                    <groupId>postgresql</groupId>
                    <artifactId>postgresql</artifactId>
                    <version>9.1-901.jdbc4</version>
                </dependency>
            </dependencies>
        </profile>
        <profile>
            <id>h2</id>
            <activation>
                <property>
                    <name>spring.profiles.active</name>
                    <value>h2</value>
                </property>
            </activation>           
            <dependencies>
                <dependency>
                    <groupId>com.h2database</groupId>
                    <artifactId>h2</artifactId>
                    <version>1.4.191</version>
                </dependency>
            </dependencies>
        </profile>
    </profiles>
    

    둘째, 스프링에 대한 기본 프로파일을 설정합니다 (이미 POM에 설정되어 있음). 웹 애플리케이션의 경우, web.xml에 다음 행을 삽입했습니다.

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

    셋째, 프로필 종속 콩을 설정에 추가하십시오. 필자의 경우 (XML 설정), 그것은 :

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="mainDataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="jpaProperties" ref="hibProps"/>
        <property name="packagesToScan">
            <list>
                <value>my.test.model</value>
            </list>
        </property>
    </bean>
    ...
    <beans profile="postgres">
        <bean name="mainDataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="org.postgresql.Driver" />
            <property name="url" value="jdbc:postgresql://127.0.0.1:5432/webchat" />
            <property name="username" value="postgres" />
            <property name="password" value="postgres" />
        </bean>
    </beans>
    
    <beans profile="h2">
        <bean name="mainDataSource"
            class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="org.h2.Driver" />
            <property name="url" value="jdbc:h2:file:./newsdb;INIT=RUNSCRIPT FROM 'classpath:init.sql';TRACE_LEVEL_FILE=0" />
            <property name="username" value="sa" />
            <property name="password" value="" />
        </bean>
    </beans>
    

    이제 다음을 할 수 있습니다.

  3. ==============================

    3.가장 먼저 필요한 것은 구성을 유지하는 두 개의 등록 정보 파일입니다. 파일의 이름은 application- {custom_suffix} .properties 패턴과 일치해야합니다. Maven 프로젝트의 src / main / resources 디렉토리에서 메인 application.properties 파일 옆에 만드십시오.이 파일은 나중에 다른 프로파일 중 하나를 활성화하고 두 프로파일이 공유하는 값을 보유하는 데 사용됩니다.

    가장 먼저 필요한 것은 구성을 유지하는 두 개의 등록 정보 파일입니다. 파일의 이름은 application- {custom_suffix} .properties 패턴과 일치해야합니다. Maven 프로젝트의 src / main / resources 디렉토리에서 메인 application.properties 파일 옆에 만드십시오.이 파일은 나중에 다른 프로파일 중 하나를 활성화하고 두 프로파일이 공유하는 값을 보유하는 데 사용됩니다.

    그런 다음 pom.xml을 수정해야합니다. 각 Maven 프로파일에서 사용자 정의 특성을 정의하고 특정 프로파일로로드하려는 해당 특성 파일의 접미어와 일치하도록 값을 설정해야합니다. 다음 샘플은 또한 기본적으로 실행될 첫 번째 프로필을 표시하지만 필수는 아닙니다.

    <profile>
        <id>dev</id>
        <properties>
            <activatedProperties>dev</activatedProperties>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>release</id>
        <properties>
            <activatedProperties>release</activatedProperties>
        </properties>
    </profile>
    

    그런 다음 동일한 파일의 빌드 섹션에서 Resources Plugin에 대한 필터링을 구성하십시오. 그러면 이전 단계에서 정의한 특성을 자원 디렉토리의 파일에 삽입 할 수 있습니다. 이는 다음 단계입니다.

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        …
    </build>
    

    마지막으로, application.properties에 다음 행을 추가하십시오.

    spring.profiles.active=@activatedProperties@
    

    빌드가 실행되면 Resources Plugin은 활성 Maven 프로파일에 정의 된 속성 값으로 자리 표시자를 대체합니다. 응용 프로그램을 시작한 후 Spring 프레임 워크는 spring.profiles.active 속성의 값으로 설명되는 활성 Spring 프로필의 이름을 기반으로 적절한 구성 파일을로드합니다. Spring Boot 1.3은 필터링 된 값에 대한 기본 Resources Plugin 구문을 대체했으며 $ {activatedProperties} 표기법 대신 @ activatedProperties @를 사용합니다.

    그것은 완벽하게 일했습니다. 희망이 당신을 도울 수 있습니다.

  4. ==============================

    4.나는 현재 Servlet 2.5와 Java 6 만 지원하는 오래된 서버 / 컨테이너에서 실행할 수 있어야하는 작은 webapp를 구축 중이다. 또한 webapp 구성이 완전히 필요하다는 요구 사항이있다. 자체 포함되어 있으므로 시스템 변수 및 / 또는 JVM 매개 변수도 사용할 수 없습니다. 관리자는 배포를 위해 컨테이너에 놓을 수있는 각 환경에 대한 .war 파일을 원할뿐입니다.

    나는 현재 Servlet 2.5와 Java 6 만 지원하는 오래된 서버 / 컨테이너에서 실행할 수 있어야하는 작은 webapp를 구축 중이다. 또한 webapp 구성이 완전히 필요하다는 요구 사항이있다. 자체 포함되어 있으므로 시스템 변수 및 / 또는 JVM 매개 변수도 사용할 수 없습니다. 관리자는 배포를 위해 컨테이너에 놓을 수있는 각 환경에 대한 .war 파일을 원할뿐입니다.

    내 webapp에서 Spring 4.x를 사용하고 있습니다. 이것은 활성 Maven 프로파일이 활성 스프링 4.x 프로파일을 설정하는 데 사용되도록 어플리케이션을 어떻게 설정했는지입니다.

    pom.xml 파일 변경

    내 POM 파일에 다음 비트를 추가했습니다. 내 POM은 모델 버전 4.0.0을 사용하고 있으며 빌드 할 때 Maven 3.1.x를 실행합니다.

    <modelVersion>4.0.0</modelVersion>
    
    ...
    
    <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <!-- Default to dev so we avoid any accidents with prod! :) -->
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!-- This can be a single value, or a comma-separated list -->
                <spring.profiles.to.activate>dev</spring.profiles.to.activate>
            </properties>
        </profile>
        <profile>
            <id>uat</id>
            <properties>
                <!-- This can be a single value, or a comma-separated list -->
                <spring.profiles.to.activate>uat</spring.profiles.to.activate>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <!-- This can be a single value, or a comma-separated list -->
                <spring.profiles.to.activate>prod</spring.profiles.to.activate>
            </properties>
        </profile>
    </profiles>
    
    ...
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.6</version>
                <configuration>
                    <webResources>
                        <webResource>
                            <filtering>true</filtering>
                            <directory>src/main/webapp</directory>
                            <includes>
                                <include>**/web.xml</include>
                            </includes>
                        </webResource>
                    </webResources>
                    <failOnMissingWebXml>true</failOnMissingWebXml>
                </configuration>
            </plugin>
            ...
        </plugins>
    </build>
    

    web.xml 파일 변경

    <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Setup for root Spring context
    -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-core-config.xml</param-value>
    </context-param>
    <!--
    Jim Tough - 2016-11-30
    Per Spring Framework guide: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-environment
    
    ...profiles may also be activated declaratively through the spring.profiles.active 
    property which may be specified through system environment variables, JVM system 
    properties, servlet context parameters in web.xml, or even as an entry in JNDI.
    -->
    <context-param>
        <param-name>spring.profiles.active</param-name>
        <param-value>${spring.profiles.to.activate}</param-value>
    </context-param>
    <!-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    

    이제 특정 Spring 프로필이 활성화되었을 때만 사용되는 아래의 Java 기반 구성 클래스를 만들 수 있습니다.

    @Configuration
    @Profile({"dev","default"})
    @ComponentScan
    @EnableTransactionManagement
    @EnableSpringDataWebSupport
    public class PersistenceContext {
        // ...
    }
    
  5. from https://stackoverflow.com/questions/25420745/how-to-set-spring-active-profiles-with-maven-profiles by cc-by-sa and MIT license