2011-05-11 2 views
10

여러 번 같은 문제가 발생했으며, 다른 사람들이이 문제에 관해 어떻게 생각하는지에 대한 의견을 나누고 싶습니다. 스프링 애플리케이션이 .war로 패키지되어 있다고 가정합니다. 파일이므로 여러 환경에서 실행하고 싶습니다..Spring 웹 어플리케이션에서 설정 파일 처리하기

응용 프로그램 (데이터베이스/웹 서비스 등)에 필요한 인프라에 액세스하려면 구성 파일에 액세스 정보를 저장하고 일부 비즈니스 구성도 해당 파일에 저장하십시오. .properties 파일을이 용도로 사용한다고 가정 해 봅시다 (전쟁 중에 스프링 응용 프로그램이 있고 app- 텍스트에서 한 줄로 읽은 속성을 갖고 있기 때문에) 그리고 다른 환경에서 우리는 동일한 appserver/servlet 컨테이너가 있습니다.

메이븐 프로파일 (각 환경에 대해 하나씩), 각각에 대해 적절한 파일에 필요한 구성을 작성하는 것입니다. 예를 들어, 다음과 같습니다 (예 : dev : test, jetty, preprod : tomcat, prod : glassfish).

최근에 저는 운영중인 사람으로부터 질문을 받았습니다 : 'preprod 환경에서 DB가 변경되면 buildserver에서 적절한 프로필로 새 빌드를 생성해야합니까?' '아니요, 실제로/webapps/currentApp/WEB-INF/classes/config/application.properties에 가서 값을 변경 한 다음 컨테이너를 다시 시작할 수 있습니다'라고 대답했습니다. '

이 문제의 몇 가지 측면을 해결하는 솔루션 : Maven 어셈블리 플러그인을 사용하여 Jetty 내부에 war를 삽입하면 '실행 가능한'전쟁으로 사용할 수있게되며 전역 구성 XML을 가질 수있는 가능성을 제공합니다. 임베디드 Jetty의 스타터는 전개 된 war 디렉토리에 적절한 .properties 파일을 작성/수정 한 다음 애플리케이션을 시작한다.

그러나 Jetty 이외의 다른 것을 사용하려는 경우에도이 문제가 해결되지 않습니다.

모두 같은 상황을 어떻게 처리합니까? 그것이 내가 작업 환경으로 이동하면

답변

9

환경 변수, 외부 설정 파일

우리는 비슷한이는 웹 응용 프로그램은 봄과 톰캣/웹 로직에서 실행. 우리가하는 일은 environment property CONFIG_PATH를 정의하고 모든 XML (스프링 구성 포함) 및 특성 파일을 해당 디렉토리에 넣는 것입니다.

우리는 tar 파일로 보내주는 여러 환경 파일을 가지고 있습니다. 웹 응용 프로그램은 CONFIG_PATH 디렉토리에서 모든 Properties/Spring 구성 파일을로드합니다. 이 변수는 해당 환경의 환경 변수로 정의됩니다.

이렇게하면 WAR 파일을 만지거나 환경을 위해 별도의 WAR를 작성하지 않습니다. 이 시나리오의 생각 : 봄 설정 XML의

, 우리는 정의 : QA & PROD의 WAR 파일을 구축, 품질 보증 QA 전쟁 파일을 테스트 PROD하지만 뭔가에 배치 PROD 전쟁 :(

우리는 다음과 같이 뭔가를 할 불면 :.

:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="order" value="0"></property> 
    <property name="locations"> 
     <list> 
      <value>file:${CONFIG_PATH}/App.properties</value> 
     </list> 
    </property> 
</bean> 

봄 설정에서 평소와 같이 모든 변수를 참조하십시오

을 web.xml에 우리는 다음과 같이 스프링 구성을 정의

QA/PROD 팀은 동일한 이슈를 해당 환경 파일과 함께 배포합니다. 뭔가가 터지면 우리는 그 env 만 알게됩니다. 엉망인 속성. HTH

+0

답변을 주셔서 감사합니다. 흥미로운 접근 방식으로 시도해 볼만한 가치가 있습니다. – abalogh

4

데이터베이스

개발자는 전쟁을 건드릴 수 없어, 그래서 우리는 다시 배포하지 않고 설정 값을 변경해야하는 경우 우리는 관계형 데이터베이스에 넣어.

서버의 재 패키징, 재배포 또는 반송이 필요하지 않습니다. 하지만 앱은 주기적으로 읽기 전용 구성을 새로 고쳐야합니다.

JNDI

JNDI 설정은 환경 환경에서 고정되어; 이러한 변경 사항은 앱 서버 관리자가 한 번 설정하고 변경하지 않습니다. (Oracle Tutorial을 참조하십시오.)

저는 JNDI가 아니라 앱 자체의 이름/값 쌍에 대해 이야기합니다.

+0

데이터베이스에 설정을 저장하는 것이 좋습니다. 입력 해 주셔서 감사합니다. 그러나 .properties 파일의 자동 읽기를 잃어 버렸고 스프링 컨텍스트가로드 된 후 수동으로로드해야합니다. (또는 데이터베이스를 사용하는 PropertyPlaceholderConfigurer와 같은 구현을 제안하십시오.) – abalogh

2

데이터 원본의 경우; Tomcat 컨텍스트에서 JNDI 리소스 항목을 만들고 리소스 항목/구성을 애플리케이션에서 분리하는 일반적인 방법입니다. DB가 변경되면 컨테이너 (Tomcat, Jetty 등)에서 JNDI 리소스를 재구성하고 다시 시작할 수 있습니다.컨테이너 팜이 있다면 Tomcat 인스턴스를 다시 시작하는 데 문제가되지 않습니다. 로드 밸런서에서 비활성화하고 다시 시작하고 다시 활성화 할 수 있습니다. Jetty에는 JNDI 리소스를 추가 할 수있는 컨텍스트 파일이 있다고 생각합니다. 또한 다른 컨텍스트에 의존하는 속성에 대한 프로필이 있습니다. 당신은 당신의 프로파일을 maven의 "-P"매개 변수로 선택할 수 있으며, 프로젝트는 이러한 설정으로 빌드됩니다 (예 : live 및 test와 같은 다른 대상 컨텍스트).

관련 문제