문제

예를 들어:

MyApp은 앱의 구성 데이터 (예 : 서버 이름)를 설명하는 속성 파일 (Server.Properties)이 포함 된 웹 앱입니다. 개발 단계에서 Server.Properties는 자체 IDE 프로젝트 폴더 (논리적 지점)에 있습니다.

이제 MyApp를 배포 할 시간입니다. IDE는 클래스 파일과 지원 구성 파일을 강화하는 것이 매우 사소합니다. 이제 우리는 단지 적절한 웹 컨테이너에 항아리를 떨어 뜨리고 멀리갑니다 ....

일주일 후 ... MyApp이 사용하는 서버 구성 데이터는 변경해야합니다. 더 의미가있는 것은 무엇입니까?

A. Server.Properties 파일을 IDE 토지에서 다시 수정하고 완전히 새 JAR 파일을 생성합니다. 재배치하십시오. (간단한 구성 변경을 위해 앱을 튀는 것을 의미합니다).

B. 이미 배포 된 JAR을 열고 Server.Properties 파일을 수정 하시겠습니까? (Server.Properties가 캐시 된 경우 MyApp에서 새로 고침 함수를 호출해야 할 수도 있지만 전체 앱 바운스가 필요하지 않아야합니다. 또한 소스 서버를 수정해야합니다. 이전 서버 이름에).

C. Server.properties를 Jar File 외부에서 처음으로 만듭니다. B의 프로세스와 매우 유사하며, JAR 외부의 구성 데이터를 유지하는 사소한 차이가 있습니다 (개발 및 생산 배포 간의 다른 경로를 소개합니다)

D. 기타 :

감사!

도움이 되었습니까?

해결책

나는 D와 함께 갈거야

.jar 외부에서 속성 파일을로드하여 실패하면 JAR에 내장 된 특성을로드하십시오.

이를 통해 각 빌드마다 "준비된"구성을 푸시 할 수 있으며 (하나의 파일 만 있으면 배포의 복잡성을 줄이면) 재정의 구성을 가능하고 합리적으로 간단하게 만듭니다.

다른 팁

Spring을 사용하는 경우 부동산 자리 표시자를 사용하여 작업을 수행 할 수 있습니다.

<!-- try and resolve the config from the filesystem first and then fallback to the classpath -->
<context:property-placeholder location="file:config.properties, classpath:config.properties"
                              ignore-resource-not-found="true"/>

파일 시스템 및 클래스 경로에 리소스를 지정할 수 있으므로 Spring은 먼저 파일 시스템에서 모든 속성을 모두 시도하고 해결 한 다음 클래스 경로로 떨어집니다. "resource-not-found"속성을 "true"로 지정하면 파일이 파일 시스템에 없으면 스프링이 예외를 던지지 않고 대신 클래스 경로에서 속성을 해결할 수 있습니다.

이 조합을 사용하면 두 파일을 통해 속성을 분할 할 수 있습니다. 예를 들어 클래스 경로의 파일에 암호를 지정하지 않으려 고 파일 시스템에서 외부로 지정 될 것으로 기대할 수 있습니다. 파일 시스템에서 누락 된 속성은 클래스 경로에서 해결됩니다.

포함 된 폴더에서 :

application.jar
config.properties

사용할 수 있어야합니다.

java -jar application.jar

참조 용 샘플 구성입니다.

# This file contains properties that are used to configure the application
database.url=127.0.0.1
database.port=3306
database.user=root
database.pass=p4ssw0rd

때에 따라 다르지. Properties 파일에 응용 프로그램 또는 라이브러리 사용자가 변경하려는 데이터가 포함 된 경우 외부에 상주해야합니다.

정적 인 데이터가 포함되어 있고 sourcecode의 값을 코딩하지 않도록 속성 파일을 만들거나 파일이 로컬로 된 문자열 인 경우 JAR에 남겨 두는 경우. 최소한 속성 파일은 사람들이 가치를 바꾸도록 초대하기 때문에;)

디.

항아리에 속성을로드하십시오. 그런 다음 Jar-Ed 속성을 기본값으로 사용하여 새 속성을 만듭니다. 그런 다음 항아리 밖에서로드하십시오. 이를 통해 속성을 선택할 수 있습니다.

J2EE에서는 J2EE 환경 외부에서 파일에 액세스 할 수 없다는 보장되지 않습니다 (직접 파일 액세스 권한 없음).

데이터가 포함 된 데이터 소스 또는 배포 아티팩트의 속성 파일을 가리려면 JNDI를 사용해야합니다.

예를 들어 WebSphere는 기본적으로 직접 파일 액세스를 허용하지 않습니다.

옵션 D. 다른 환경에서 데이터베이스 또는 프록시 등에 연결하는 것과 같은 환경 속성을 지정해야 할 수도 있습니다.

주목할만한 다른 것은 생산에서 항아리를 준비하거나 항아리의 속성 파일을 교체하지 않고도 속성을 신속하게 변경할 수 있다는 것입니다.

예를 들어 데이터베이스 서버가 끝나고 다른 서버를 가리켜야합니다 (데이터베이스의로드 밸런서를 사용하지 않는 경우). 따라서 데이터베이스 속성을 교체하고 다시 시작하기 만하면됩니다. 당신은 거기에서 많은 시간을 절약합니다.

종종 코드를 마이그레이션 해야하는 기준입니다. 변하지 않은 테스트에서 생산까지. 이는 임베디드 구성 파일을 편집 할 수 없음을 의미합니다. 또한 배포 된 구성을 변경 해야하는 상황으로 끝날 수 있습니다. 따라서 우리는 jars 밖에 configuraiton을 남겨 둡니다.

Java EE 애플리케이션의 경우 ClassPath의 JNDI 또는 속성 파일을 고려하십시오.

이웃 웹 응용 프로그램에서 구성이 다시 이웃을 분리하기 위해 구성된 웹 응용 프로그램이 있습니다. 그것은 훨씬 쉬운 것으로 판명되었습니다.

나는 WebApps (Wars)에서 속성 파일을 사용하지만 대부분 불변의 기본값과 물건에 대해서는 대부분의 경우 WebApps가 전쟁을 업데이트하지 않아야하기 때문에).

그러나 당신이 말하는 것과 같은 것들에 대해서는 JNDI를 사용합니다. Web.xml 파일의 속성을 리소스로 정의 할 수 있습니다. 그렇게하면 최악의 경우 앱 자체가 아닌 Web.xml을 업데이트합니다.

일부 서버의 경우 전쟁을 전혀 건드리지 않고 이러한 리소스 값을 무시하는 방법이 있습니다. 예를 들어, Tomcat에서.

나는 일반적으로 Tomcat의 컨텍스트 XML 파일을 사용하여 테스트, Q/A 및 생산을 위해 한 번의 전쟁을하고 환경에 민감한 리소스를 과체합니다. 테스트중인 앱은 제작중인 앱과 거의 동일하기 때문에 여러 전쟁을 구축하거나 전쟁을 수정하는 것보다 훨씬 더 나은 것으로 생각합니다.

답은 구성에 대한 버전 제어가 필요하다고 생각하는지 여부에 달려 있다고 생각합니다. (회귀 테스트를위한 프로덕션 구성 또는 구성이 될 수 있습니다 ...)

  • 버전 컨트롤이 필요하지 않은 경우 속성 파일을 무시하는 외부 속성 파일이있는 옵션 D는 좋은 것입니다. 옵션 B와 C는 물건 업에 더 개방적이지만, 실제로 신경 쓰면 버전 제어를 사용하고있을 것입니다 :-)
  • 버전 제어가 필요한 경우 옵션 A는 더 많은 제어 기능을 제공하지만 여러 배포 가능성이있는 경우 버전 각 배포에 대한 구성을 제어해야 할 수도 있습니다. 예를 들어 테스트 및 생산 플랫폼을위한 별도의 배포가 있습니다.

Maven 모듈과 Maven War 파일 "오버레이"를 사용 하여이 작업을 수행하는 방법은 다음과 같습니다.

  1. Java 코드 구성 요소에 대한 여러 모듈이 있습니다. 이들은 항아리 모듈입니다.
  2. 정적 컨텐츠, JSP 및 코어 구성 데이터 (스프링 배선, 기본 속성)에 대한 "Base WebApp"모듈이 있습니다. 이것은 전쟁 모듈이므로 건물의 결과는 위의 + 모든 JAR 파일을 포함하는 전쟁입니다.
  3. 각각의 고유 한 "사이트 구성"은 속성, 배선 파일 및 컨텐츠에 대한 사이트 별 재정의를 포함하는 전쟁 모듈입니다. 오버라이 딩은 Maven War "Overay"메커니즘을 사용하여 설명되며, "기본"전쟁과 재정의에서 새로운 전쟁이 시작됩니다.

이 모든 것이 버전 제어에 체크되어 있으며 구성 변경을 위해 Maven 빌드 및 전쟁 배포를 수행해야합니다.

비슷한 질문을했습니다. 우리는 아직 그것을 모두 알아 내지 못했습니다. 그러나 우리는 URL 리소스를 조사하고 있습니다. 속성 파일이 SVN에서 직접 읽습니다. 속성 파일 이외의 다른 것을 업데이트 할 필요가 없습니다.

스프링을 사용하여 J2EE 응용 프로그램을 개발합니다. 나는 같은 문제를 꽤 오랫동안 달리고 있었고 해결책을 찾았습니다. 내 문제는 내가 배포 한 전쟁 파일 외부의 속성 파일에 데이터베이스 속성을 지정하는 것이 었습니다. 내가 찾은 솔루션은 PropertyPlaceHolderConfigurer를 사용하고 위치 속성을 지정하여 시스템 위치를 찾는 것입니다.

이것은 매우 간단했고 잘 작동했습니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top