당신은 어떻게 관리하는 임베디드 구성 파일과 라이브러리 파일에 java 웹 어플리케이션?

StackOverflow https://stackoverflow.com/questions/582248

문제

나는 현재 작업에 j2ee 프로젝트는 베타습니다.지금 우리가 망치 문제의 일부와 함께 배포 프로세스입니다.특히,숫자가 있는 파일에 내장 된 전쟁(일부 xml 파일과.성)해야 하는 다른 버전이 배포하고 있는지 여부에 따라서 개발자,테스트 또는 생산 환경이다.재료 loglevels,연결 수영장,등등.

그래서 내가 어떻게 여종의 구조들을 사용하는 방법에 대해 자세 webapps.당신은 오프로드로 구성할 수 있는 응용 프로그램 server?당신이 대체하는 설정 파일을 프로그래밍 방식으로 배포하기 전에?버전을 선택하는 동안 빌드 프로세스?수동으로 편집하는가?

또한 얼마나 당신에게 가서 제공에 의존성 응용 프로그램을 통해 서버의 정적 라이브러리와 당신은 얼마나 넣어 전쟁에서 자신?이 모든 것을 그냥 몇 가지 아이디어가 일반적인(또는 아마도 최고)연습니다.

도움이 되었습니까?

해결책

작업 환경에서 별도의 서버가 팀이 수행하는 구성의 QA 및 생산 서버의 응용 프로그램에 대한.각각의 응용 프로그램은 일반적으로 배포되는 두 개의 서버에서 QA 및 삼 서버에서 생산입니다.내 dev 팀을 발견하고 그것이 최소화하기 위해 최선을 다량의 구성에 필요하여 서버에 둠으로 많은 구성에서 가능한 전쟁(또는 귀).이렇게 서버 구성을 쉽고 또한 가능성을 최소화하는 서버 팀은 잘못 서버를 구성합니다.

우리는 없는 기계는 특정 구성,하지만 우리가 할 수 있는 환경 구성(Dev,품질관리 및 생산).우리가 구성 파일이 저장된 전쟁에서 파일 이름 통해 환경(ex.dev.성,품질보증을 수행합니다.성,prod.성).가-D 성 서버에서 VM 의 java 명령을 지정하는 환경(ex.java-Dapp.env=prod...).응용 프로그램를 찾을 수 있습니다.env 시스템의 성과를 결정하기 위해 사용하는 이름의 properties 파일을 사용합니다.

나는 가정이 있는 경우는 소수의 기계-특정 속성을 지정대로 그들을-D 속성 뿐만 아니라.공용 구성하는 쉬운 방법을 제공합을 결합하는 특성으로 파일 시스템 속성입니다.

우리는 연결 구성 수영장에서 서버입니다.우리는 이름의 연결이 수영장 같은 모든 환경을 간단히 서버에 할당된 각각의 환경에 적합한 데이터베이스.응용 프로그램만 알면 하나의 연결을 수영장 이름입니다.

다른 팁

속성이 기계/배포 특이 적이라면 기계에 속한다고 생각합니다. 내가 전쟁에서 물건을 마무리하려고한다면, 그것은 낙하 할 수 있어야하며, 이는 실행중인 기계에만 해당되는 것이 없다는 것을 의미합니다. 전쟁에 기계 의존적 특성이 있으면이 아이디어가 깨질 것입니다.

내가 좋아하는 것은 속성을 갖춘 프로젝트를 구축하는 것입니다. 교도 파일, 각 기계에는 전쟁이 접근 할 수있는 곳에 살 수있는 .properties가 있습니다.

대안적인 방법은 예를 들어, Dev-War, Stage-War, Prod-war에 대한 개미 작업을 수행하는 것입니다. 프로젝트의 속성 세트가 전쟁에서 구운 부분을 구운 것입니다. 프로젝트 빌드의 일부로 개별 서버에 파일 위치와 같은 것들을 갖게되기 때문에 이것을 좋아하지 않습니다.

WRT 구성 파일이라고 생각합니다 스티브 대답은 지금까지 최고의 것입니다. 전쟁 파일의 설치 경로와 관련하여 외부 파일을 만드는 제안을 추가합니다. 따라서 다른 구성으로 한 서버에 여러 번 전쟁을 설치할 수 있습니다.

예 : 내 dev.war 포장을 풀립니다 /opt/tomcat/webapps/dev, 그럼 나는 사용할 것이다 ServletContext.getRealPath 기본 폴더 및 전쟁 폴더 이름을 찾으려면 구성 파일이 ../../config/dev 전쟁과 관련하여 또는 /opt/tomcat/config/dev 절대적으로.

나는 또한 동의합니다 계산서 이 외부 구성 파일에 가능한 한 적은 양을 넣는 것입니다. 환경에 따라 데이터베이스 또는 JMX를 사용하여 의미가있는만큼 저장합니다. Apache Commons 구성은 다음과 같습니다 좋은 대상 데이터베이스 테이블에 의해 뒷받침되는 구성을 처리합니다.

도서관과 관련하여 동의합니다 알려지지 않은 모든 libs를 가지고 있습니다 WEB-INF/lib 전쟁 파일의 폴더 (자체 포장). 장점은 애플리케이션의 각 설치가 자율적이며 다양한 버전의 라이브러리를 동시에 사용하여 전쟁의 다른 빌드를 가질 수 있다는 것입니다.

단점은 각 웹 애플리케이션에 자체 클래스 로더로로드 된 자체 클래스 사본을 갖기 때문에 더 많은 메모리를 사용한다는 것입니다.

이것이 진정한 관심사를 제기한다면, 당신은 당신의 서블릿 컨테이너의 일반적인 라이브러리 폴더에 항아리를 넣을 수 있습니다 ($CATALINA_HOME/lib Tomcat의 경우). 동일한 서버에서 실행되는 웹 애플리케이션의 모든 설치는 동일한 버전의 라이브러리를 사용해야합니다. (실제로, 그것은 당신이 개인에게 우선적 인 버전을 넣을 수 있기 때문에 엄격하게 사실이 아닙니다. WEB-INF/lib 필요한 경우 폴더이지만 유지하기가 지저분 해지고 있습니다.)

이 경우 InstallShield 또는 NSIS 또는 운영 체제에 해당합니다. 최신 라이브러리 세트가 있고 업그레이드, 다운 그레이드 등이 있는지 쉽게 알 수있는 것.

나는 보통 두 개의 속성 파일을 만듭니다.

  • 앱에 포함 된 앱 세부 사항 (메시지, 내부 "마술"단어) 용은 앱에 포함되어 있습니다.
  • 다른 하나는 환경 세부 사항 (DB 액세스, 로그 레벨 및 경로 ...) 각 서버의 클래스 경로에 노출되고 "고정 된"(내 앱으로 전달되지 않음). 보통 나는 목표 대상에 따라 특정 값을 넣기 위해 "mavenise"또는 "앤트워스".
  • Cool Guys는 JMX를 사용하여 앱 conf를 유지하지만 (Conf는 재배치하지 않고 실시간으로 수정할 수 있지만) 내 요구에 비해 너무 복잡합니다.

Server 's (static?) 라이브러리 : 서버에 종속성을 추가 할 때 내 앱에서 서버 라이브러리 사용을 강력하게 권장하지 않습니다.

  1. IMO, 내 앱은 "자체 포장"이어야합니다. 내 전쟁을 떨어 뜨리고 그게 전부입니다. 나는 20MBS의 항아리와의 전쟁을 보았고, 그것은 나에게 혼란스럽지 않습니다.
  2. 일반적인 모범 사례는 외부 의존성을 J2EE Dogma에서 제공하는 것, J2EE API (서블릿, EJBS, JNDI, JMX, JMS 사용)로 제한하는 것입니다. 앱은 "서버가 아노 스틱"이어야합니다.
  3. 앱 (전쟁, 귀, wathever)에 종속성을 두는 것은 자체 문서화입니다. 앱에 의존하는 라이브러리를 알고 있습니다. 서버 리브를 사용하면 이러한 종속성이 덜 분명하므로 이러한 종속성을 명확하게 문서화해야합니다 (곧 개발자는이 작은 마법을 잊게 될 것입니다).
  4. AppServer를 업그레이드하면 서버 LIB에 의존 할 가능성도 변경됩니다. AppServer 편집자는 내부 Libs의 버전에서 버전으로의 호환성을 유지하지 않아야합니다 (대부분은 그렇지 않습니다).
  5. AppServer (Jakarta Commons Logging, 일명 JCL이 떠오르는 경우)에 널리 사용되는 LIB를 사용하고 최신 기능을 얻기 위해 버전을 만들고 싶다면 AppServer가 지원하지 않을 큰 위험을 감수합니다.
  6. 정적 서버 객체 (서버 클래스의 정적 필드, 예 : 맵 또는 로그)에 의존하는 경우이 개체를 청소하려면 AppServer를 재부팅해야합니다. 당신은 당신의 앱을 핫 레드를 배포 할 수있는 능력을 느슨하게합니다 (오래된 서버 객체는 여전히 재배치 사이에 존재합니다). AppServer 전체 객체를 사용하면 (J2EE에 의해 정의 된 것 외에) 특히이 개체가 여러 앱간에 공유되는 경우 미묘한 버그가 발생할 수 있습니다. 그렇기 때문에 appserver lib의 정적 필드에있는 객체의 사용을 강력히 낙담시킵니다.

"이 AppServer의 항아리 에이 개체"가 절대적으로 필요하다면 다른 서버의 JAR에 의존하지 않기를 바라면서 앱의 항아리를 복사하고 앱의 클래스로드 정책을 확인하십시오 ( "부모 마지막"클래스로드를하는 습관을 섭취하십시오. 내 모든 앱에 대한 정책 : 서버의 항아리에 의해 "오염"되지 않을 것이라고 확신합니다. 그러나 그것이 "모범 사례"인지 모르겠습니다).

모든 구성을 데이터베이스에 넣었습니다. 컨테이너 (Tomcat, WebSphere 등)는 초기 데이터베이스 연결에 액세스 할 수있게 해주 며 그때부터 모든 것이 데이터베이스에서 나옵니다. 이를 통해 다운 타임 (또는 적어도 재개 배포없이)없이 여러 환경, 클러스터링 및 동적 변경이 가능합니다. 특히 Nice는 즉시 로그 레벨을 즉시 변경할 수 있습니다 (변경 사항을 선택하려면 관리 화면이나 배경 리프레셔가 필요하지만). 분명히 이것은 앱을 시작할 필요가없는 것들에만 적용되지만 일반적으로 시작 후에는 데이터베이스에 매우 빨리 얻을 수 있습니다.

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