programing

메이븐 종단을 사용하여 스프링 활성 종단을 설정하는 방법

megabox 2023. 8. 17. 21:05
반응형

메이븐 종단을 사용하여 스프링 활성 종단을 설정하는 방법

메이븐을 빌드 도구로 사용하는 애플리케이션이 있습니다.

메이븐 프로필을 사용하여 다른 프로필에서 다른 속성을 설정하고 있습니다.

제가 하고 싶은 것은 메이븐의 모든 활성 프로필이 스프링 활성 프로필로도 포팅되어 서명으로 참조할 수 있도록 하는 것입니다(@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>

봄에 갖고 싶은 다른 프로필을 지정하지 않고 메이븐을 실행한다고 가정합니다.profile1그리고.development적극적인 프로파일로.

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

먼저 POM에 프로파일을 추가합니다(주의 - 메이븐+스프링 프로파일은 단일 시스템 변수에 의해 활성화됨).

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

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

  • Postgres DB에서 다음을 사용하여 내 웹 앱 실행mvn jetty:run또는mvn jetty:run -Dspring.profiles.active=postgres명령들
  • H2 DB에서 웹 앱 실행하기mvn clean jetty:run -Dspring.profiles.active=h2

가장 먼저 필요한 것은 구성을 유지하기 위한 두 개의 속성 파일입니다.파일 이름은 패턴 application-{custom_suffix} 속성과 일치해야 합니다.Maven 프로젝트의 src/main/resources 디렉토리에서 mainapplication.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>

그런 다음 동일한 파일의 빌드 섹션에서 리소스 플러그인에 대한 필터링을 구성합니다.그러면 이전 단계에서 정의한 속성을 리소스 디렉토리의 모든 파일에 삽입할 수 있으며, 이는 다음 단계입니다.

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

마지막으로 application.properties에 다음 행을 추가합니다.

spring.profiles.active=@activatedProperties@

빌드가 실행되면 리소스 플러그인이 자리 표시자를 활성 Maven 프로파일에 정의된 속성 값으로 바꿉니다.응용 프로그램을 시작한 후 스프링 프레임워크는 활성 스프링 프로필의 이름을 기반으로 적절한 구성 파일을 로드합니다. 이 이름은 spring.profiles.active 속성 값으로 설명됩니다. 1하고 Spring Boot 1.3을 사용합니다.@activatedProperties@${activatedProperties}

완벽하게 작동했습니다.이것이 당신에게 도움이 되길 바랍니다.

봄에 활성화할 프로필에 대한 정보가 들어 있는 속성 파일과 같은 응용 프로그램의 리소스를 필터링해야 합니다.

예를 들어.

spring.profile = ${mySpringProfile}

각 이합니다.mySpringProfile).

빌드하는 동안 이 값은 현재 활성 프로필에 정의된 값에 따라 필터링됩니다.

그런 다음 응용 프로그램의 부트스트랩 중에 이 파일에 따라 적절한 프로필을 선택합니다(자세한 정보를 제공하지 않았기 때문에 더 이상 도움이 될 수 없습니다만, 이것은 매우 쉽습니다.

참고: 현재 활성 프로파일을 maven에서 가져올 방법을 찾을 수 없습니다(예: project.profiles.active와 같이 -P 값을 유지합니다). 그래서 각 프로파일에 대해 새 변수를 설정해야 합니다.

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

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

참고 3: 이는 실제로는 잘못된 관행이며 시스템 속성을 사용하여 런타임에 프로필을 설정해야 합니다.

Boot 프로그램의 Spring Boot의 할 수 .pom.xml그런 다음 해당 속성을 참조하십시오.application.properties.

을 에 추가합니다.pom.xml를 들어, 예를들어, 라불는재산로라는 spring.profile.from.maven:

<profiles>
    <profile>
        <id>postgres</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profile.from.maven>postgres</spring.profile.from.maven>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>noDb</id>
        <properties>
            <spring.profile.from.maven>noDb</spring.profile.from.maven>
        </properties>
    </profile>
</profiles>

에서 속성 application.properties:

spring.profiles.include=@spring.profile.from.maven@

설정을 과 함께 메이븐을 합니다.postgres 또는 됩니다.postgresSpring과 Spring의 프로필 Spring , Maven사실용프필.noDb메이븐 프로필은 다음을 추가합니다.noDb스프링의 활성 프로필 목록에 대한 스프링 프로필.

표시자 추가하기${activeProfile} webweb.xml 파일:

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

각 프로파일에 대해 pom.xml의 속성을 설정합니다.

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

더하다maven-war-plugin 트세를 합니다.<filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>를 실행할 때 .mvn package -Pprofile1또는mvn package -Pprofile2:

<build>
  <plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.2.2</version>
    <configuration>
      <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
    </configuration>
  </plugin>
</build>

저는 현재 (제가 통제할 수 없는 이유로) Servlet 2.5 및 Java 6만 지원하는 이전 서버/컨테이너에서 실행할 수 있어야 하는 작은 웹 앱을 구축하고 있습니다.또한 웹 애플리케이션 구성이 완전히 자체적으로 포함되어야 하므로 시스템 변수 및/또는 JVM 매개 변수도 사용할 수 없습니다.관리자는 배포를 위해 컨테이너에 넣을 수 있는 각 환경의 .war 파일을 원합니다.

웹 앱에서 Spring 4.x를 사용하고 있습니다.이렇게 하여 활성 Maven 프로파일이 활성 Spring 4.x 프로파일을 설정하는 데 사용되도록 애플리케이션을 구성했습니다.


pom.xml 파일 변경 사항

저는 제 POM 파일에 다음 비트를 추가했습니다.제 POM은 모델 버전 4.0.0을 사용하고 있으며 빌드할 때 메이븐 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 {
    // ...
}

스프링 부트 플러그인 자체는 다음과 같은 이점이 있습니다.

  <profiles>
    <profile>
      <id>postgres</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
              <jmxPort>9001</jmxPort>
              <environmentVariables>
                <SPRING_PROFILES_ACTIVE>postgres</SPRING_PROFILES_ACTIVE>
              </environmentVariables>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>h2</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
              <jmxPort>9002</jmxPort>
              <environmentVariables>
                <SPRING_PROFILES_ACTIVE>h2</SPRING_PROFILES_ACTIVE>
              </environmentVariables>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

스프링 부팅 애플리케이션에서 프로필을 설정하는 방법은 여러 가지가 있습니다(개발, uat, prod 등).

예: 속성 파일에 다음을 추가할 수 있습니다.

spring.profiles.active=dev

프로그래밍 방식:

SpringApplication.setAdditionalProfiles("dev");

활성 프로필을 지정하려면 이 줄을 사용합니다.

@ActiveProfiles("dev")

유닉스 환경에서

export spring_profiles_active=dev

dev 프로파일로 jar 파일을 실행하고 있습니다.

java -jar -Dspring.profiles.active=dev JARNAME.jar

여기서JARNAME.jar응용 프로그램의 jar를 의미합니다.

언급URL : https://stackoverflow.com/questions/25420745/how-to-set-spring-active-profiles-with-maven-profiles

반응형