복붙노트

[SPRING] Maven과 Spring을 이용한 프로젝트 제어 : Maven 프로파일을 사용하여 Spring 설정 파일을 설정하는 방법은 무엇입니까?

SPRING

Maven과 Spring을 이용한 프로젝트 제어 : Maven 프로파일을 사용하여 Spring 설정 파일을 설정하는 방법은 무엇입니까?

특정 Maven 프로파일이 활성 상태인지 여부에 따라 데이터베이스 정보로 Spring 구성 파일을 구성하려고합니다. 나는 이것에 대한 답변을 보았지만 모두 함께 모으는데 어려움을 겪고있다.

나는 이와 같은 Maven 프로파일을 가지고있다 :

<profiles>
    <profile>
        <id>production</id>
        <activation>
            <property>
                <name>environment.type</name>
                <value>prod</value>
            </property>
        </activation>
    </profile>

    <profile>
        <id>development</id>
        <activation>
            <property>
                <name>environment.type</name>
                <value>dev</value>
            </property>
        </activation>

        <!-- Database properties for Spring -->
        <properties>
            <db.driver>oracle.jdbc.driver.OracleDriver</db.driver>
            <db.type>oracle</db.type>
            <db.host>192.168.0.0</db.host>
            <db.port>1521</db.port>
            <db.name>myDb</db.name>
            <db.url>jdbc:${db.type}:thin:@${db.host}:${db.port}:${db.name}</db.url>
        </properties>

그리고 settings.xml 파일은 다음과 같습니다 :

<servers>
  <server>
    <id>development</id>
    <username>jsmith</username>
    <password>secret</password>
  </server>
</servers>

....

<profiles>
  <profile>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>

    <properties>
      <environment.type>dev</environment.type>
    </properties>
  </profile>
</profiles>

그리고 servlet-context.xml에서 :

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
    <property name="driverClassName">
        <value>${db.driver}</value>
    </property>

    <property name="url">
        <value>${db.url}</value>
    </property>

    <property name="username">
        <value>${db.username}</value>
    </property>

    <property name="password">
        <value>${db.password}</value>
    </property>

    <property name="maxActive">
        <value>10</value>
    </property>

    <property name="maxIdle">
        <value>1</value>
    </property>
</bean>

제 질문은 기본적으로 Maven 속성을 servlet-context.xml 파일에 어떻게 가져 옵니까? .properties 파일이 필요합니까? Spring의 Maven과 PropertyPlaceholderConfigurer에서 필터링에 대해 조금 알고 있지만 함께 모으는 방법을 모릅니다. 아니면 더 간단한 방법이 있습니까?

해결법

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

    1.일반적으로 말하자면, 예, 당신은 .properties 파일을 사용해야합니다, 이것은 우리가 일반적으로하는 일입니다. 특히 Spring 컨텍스트 파일에서 데이터베이스 연결 설정을 처리하는 경우에 그렇습니다.

    일반적으로 말하자면, 예, 당신은 .properties 파일을 사용해야합니다, 이것은 우리가 일반적으로하는 일입니다. 특히 Spring 컨텍스트 파일에서 데이터베이스 연결 설정을 처리하는 경우에 그렇습니다.

    .properties 파일의 목적은 응용 프로그램 런타임에서 데이터베이스 연결을 구성하는 기능을 제공하는 것입니다 (웹 응용 프로그램의 경우 일반적으로 .properties 파일이 변경된 후 응용 프로그램 컨테이너 / 서버를 다시 시작해야 함). 이것은 보통 다른 환경 (DEV / TEST / UAT / PROD)에서의 어플리케이션 배치 / 설치 단계에서 수행됩니다.

    이러한 데이터베이스 연결 설정을 pom.xml에 저장하는 것은 좋지 않습니다. pom.xml의 목적은 프로젝트 설명을위한 것이며 응용 프로그램 빌드시에만 한 번만 사용됩니다 (예 : mvn deploy). 그리고 대부분의 경우, 최종 jar / war 파일에 압축되어 있어도 응용 프로그램을 작성한 후에는 실제로 다루지 않습니다.

    Spring 컨텍스트에서 .properties 파일을 사용하려면 applicationContext에서 propertyConfigurer bean을 정의하십시오. 예를 들면 다음과 같습니다.

    <bean id="propertyConfigurer"
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <property name="locations">
        <list>
          <!-- Default location inside war file -->
          <value>classpath:db.properties</value>
          <!-- Environment specific location, a fixed path on server -->
          <value>file:///opt/my-web-app/conf/db.properties</value>
        </list>
      </property>
      <property name="ignoreResourceNotFound" value="true"/>
    </bean>
    

    희망이 의미가 있습니다.

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

    2.두 가지 대답과 연구에서 배운 것을 사용하여 올바른 데이터베이스 값을 설정하는 pom에 의해 제어되는 개발 / 생산 시스템을 얻을 수있었습니다.

    두 가지 대답과 연구에서 배운 것을 사용하여 올바른 데이터베이스 값을 설정하는 pom에 의해 제어되는 개발 / 생산 시스템을 얻을 수있었습니다.

    첫째로, pom에서 나는 두 개의 프로파일을 만들었습니다.

    <!-- Production and Development Profiles -->
    
    <profiles>
        <!-- Nike profile needs go here -->
        <profile>
            <id>production</id>
            <activation>
                <property>
                    <name>environment.type</name>
                    <value>prod</value>
                </property>
            </activation>
        </profile>
    
        <!-- Catalyst profile needs go here -->
        <profile>
            <id>development</id>
            <activation>
                <property>
                    <name>environment.type</name>
                    <value>dev</value>
                </property>
            </activation>
    
            <build>
    
                <!-- This holds the properties for the Spring context file.
                     Database values will be changes to development. -->
                <filters>
                    <filter>src/main/resources/dev.database.properties</filter>
                </filters>
    
                <resources>
    
                    <!-- This is the directory that holds the Spring context
                         file.  The entire folder is searched, so either no
                         other file should have place holders or you should
                         exclude other files from being filtered. -->
                    <resource>
                        <directory>src/main/webapp/WEBINF/</directory>
                        <filtering>true</filtering>
                    </resource>
                </resources>
        </profile>
    </profiles>
    

    servlet-context.xml의 WEB INF 디렉토리에서 place holder를 넣습니다.

    <!-- For database, uses maven filtering to fill in placeholders -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${db.driver}" />
        <property name="url"             value="${db.url}" />
        <property name="username"        value="${db.username}" />
        <property name="password"        value="${db.password}" />
        <property name="maxActive">
            <value>10</value>
        </property>
        <property name="maxIdle">
            <value>1</value>
        </property>
    </bean>
    

    그런 다음 src / main / resources에 앉아 속성 파일을 만들었습니다.

    #
    # Development database properties file
    #
    db.driver=oracle.jdbc.driver.OracleDriver
    db.url=jdbc:oracle:thin:[USER/PASSWORD]@[HOST][:PORT]:SID
    db.username=jsmith
    db.password=s3cr3t
    

    다음으로 Maven을 시작할 수 있습니다.

    mvn -P developement clean install
    

    나에게 맞는 프로필을 설정하는 settings.xml이 있어야합니다.

    <settings>
      <profiles>
        <profile>
          <activation>
            <activeByDefault>true</activeByDefault>
          </activation>
    
          <properties>
            <environment.type>dev</environment.type>
          </properties>
        </profile>
      </profiles>   
    </settings>
    
  3. ==============================

    3.주된 질문은 : RPM, 젠킨스 빌드를 통해 다른 환경에 어떻게 WAR 파일을 배포 할 것입니까? 또한 모든 환경에 동일한 WAR 파일을 배포 하시겠습니까?

    주된 질문은 : RPM, 젠킨스 빌드를 통해 다른 환경에 어떻게 WAR 파일을 배포 할 것입니까? 또한 모든 환경에 동일한 WAR 파일을 배포 하시겠습니까?

    a) JENKINS 작업에서 (또는 수동으로 Maven을 통해) WAR를 전개하고, 자원을 처리하고 jar 빌드 프로세스에서 프로파일을 사용하려면 (mvn -P production clean deploy), maven pom은 코드를 포함해야한다. 이렇게 :

        <filters>
            <filter>${config.maven.plattform.resources}/environment/${config.environment.dir}/your_proyect.properties</filter>
        </filters>
        <resources>
            <resource>
                <directory>resources/servlet-context.xml</directory>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>target/generated-resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    

    your_proyect.properties 파일 (환경마다 하나씩)에 등록 정보를 정의하고 모든 다른 프로파일에 대해 config.environment.dir을 정의해야합니다.

    b) 모든 프로젝트에서 동일한 WAR / RPM을 원한다. 그런 다음 응용 프로그램 servert : -DENVIRONMENT = production의 Java 시작에서 환경으로 환경을 정의한 다음 yorkw이 지적한대로 매개 변수가있는 PropertyPlaceholderConfigurer로 모든 특성을로드해야합니다.

    <bean id="propertyPlaceholderConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
            <value>classpath:environment/${ENVIRONMENT}/your_project.properties</value>
            </list>
        </property>
    </bean>
    

    또한 WAR의 모든 속성을 저장하는 것을 잊지 마십시오. WAR 빌드의 POM에는 다음과 같은 코드가 포함되어야합니다.

                    <execution>
                        <id>copy-env-resources</id>
                        <!-- here the phase you need -->
                        <phase>validate</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${basedir}/src/main/webapp/WEB-INF/classes/environment/</outputDirectory>
                            <overwrite>true</overwrite>
                            <resources>
                                <resource>
                                    <directory>${basedir}/${build_to_all_your_environments}</directory>
                                    <includes>
                                        <include>**/*.properties</include>
                                    </includes>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
    

    c) 혼합 된 경우 : 서버 (-D)의 속성으로 정의 된 환경을 수동으로 선택할 수 있습니다. 기본 속성을 사용하여이 속성을 가져올 수 있습니다 (해당 속성이없는 경우이 단계) 당신이 내 게시물을 확인하고 싶다면 다른 속성 집합이 필요하기 때문에 꽤 복잡합니다. Maven과 Spring을 사용하는 다른 환경을위한 배포, 나는 더 나은 솔루션에 관심이 있습니다. c)

  4. from https://stackoverflow.com/questions/11874017/controlling-a-project-with-maven-and-spring-how-to-set-spring-config-file-using by cc-by-sa and MIT license