2009-06-26 6 views
1

저희 가게에서는 약 20 개의 Java EE 웹 응용 프로그램을 유지 관리하고 있습니다. 이러한 응용 프로그램의 대부분은 아키텍처에서 상당히 CRUD와 유사하며 일부는 꽤 프로세서 집약적 인 계산 응용 프로그램입니다.Java EE Jar 파일 공유

우리는이 응용 프로그램을 배포하기 위해 Hudson을 사용하여 CVS 저장소를 모니터링했습니다. 체크인이있을 때, 프로젝트는 Tomcat 6.0 서버에 컴파일되고 배포되도록 설정됩니다 (Solaris 10, sparc 듀얼 코어 1.6GHz 프로세서, 2GB RAM ...). 상상력 ...) 프로젝트에 대한 단위 테스트가있는 경우 해당 프로젝트가 실행되고 단위 테스트가 통과 된 경우에만 프로젝트가 배포됩니다. 이것은 잘 작동합니다.

시간이 지남에 따라 내가 만드는 많은 프로젝트가 동일한 .jar 파일을 반복적으로 사용한다는 것을 알게되었습니다 (Hibernate, POI (Excel 출력), SQL Server JDBC 드라이버, JSF, ICEFaces, 비즈니스 논리 .jar 파일 등). 우리의 연습은 우리 네트워크 드라이브의 폴더를 우리가 사용하고있는 모든 기본 .jar 파일로 유지하는 것이 었으며, 새로운 프로젝트가 시작될 때이 .jar 파일 세트를 새 프로젝트에 복사하고 거기에서부터 시작합니다. .. 그리고 나는 그렇게 느낀다 더러움 이것이 일어날 때마다 나는 밤에 나를 양육하기 시작했다. 동료들에 의해 Tomcat 서버에 .jar 저장소를 설치하는 것이 "매우 어렵습니다"라고 말했고, 이것은 두 번째 구매하지 않습니다 ... 나는 그것을 순수한 게으름으로 돌리고 아마도, 모범 사례를 배우고 싶지는 않습니다. 나는 틀릴 수있다, 그러나, 나는 다만 사정에 나의 감각을 진술하고있다. 이것은 서버에 배치되는 우리의 .war 파일의 크기를 팽창시키는 것처럼 보입니다.

Tomcat에는 자체적으로 배포 된 모든 응용 프로그램에 액세스 할 수있는 .jar 파일 집합이 있으므로 모든 프로젝트에서 이러한 .jar 파일을 통합하고 이동할 수 있다고 생각합니다. 그들을 tomcat 서버에 추가하십시오. 예를 들어 ICEFaces .jar 파일을 새 버전으로 업데이트해야하는 경우 서버의 .jar 파일 만 업데이트하면됩니다.

또 다른 부분은 서버에 .jar 파일 복사본을 하나만 포함시킴으로써 서버의 lib 디렉토리 복사본을 내 개발 환경에 보관해야한다는 것입니다 (예 : .jar 파일을 일식 의존성).

내 직감은 내가 복제 한 .jar 파일을 서버로 옮기고 싶다고 말합니다.

답변

2

Maven과 Ivy가 JAR 종속성을 관리하는 데 도움이되었다고 생각합니다. 아마 도움이 될 것입니다.

모든 프로젝트에서 JAR을 복제하는 것과 서버/lib에 배치하는 것에 대한 논란이있는 한 Tomcat에 배포 된 모든 단일 응용 프로그램을 업그레이드 할 가능성은 어느 정도입니까? 동시에? 서버에서 N 개의 앱을 실행하고 N + 1 번째 앱이 특정 JAR의 최신 버전을 원하거나 필요로 할 수있는 시간을 상상할 수 있습니까?

모든 앱을 동기화 상태로 유지할 수 있다면 꼭 공통 라이브러리 기반을 사용하게하십시오.

개인적으로는 디스크 공간이 저렴하다고 생각합니다. 필자가 선호하는 것은 각 애플리케이션에 JAR 파일을 복사하여 WAR 파일에 저장하는 것입니다. 나는 파티셔닝을 좋아한다. OSGi가 주류가되면 더 많이보고 싶습니다.

1

대부분의 경우 작동하지만, 바람둥이로 이동 한 항아리가 웹 응용 프로그램 항아리 중 하나에서 클래스의 인스턴스를 만들려고하는 성가신 상황에 빠져 ClassNotFoundException을 던져 버릴 수 있습니다 . 나는 이것을 해왔지만 이러한 문제들로 인해 멈췄다.

1

나는 공통적으로/lib 디렉토리에 라이브러리를 넣는 것이 좋다고 생각하지 않는다. 서블릿 컨테이너에 응용 프로그램으로 war 파일을 사용한다는 아이디어는 웹 응용 프로그램 간의 격리에 대한 진정한 아이디어를 얻는 것입니다. WEB-INF/lib에 자체 라이브러리가있는 일부 타사 WAR를 배포하는 것과 같은 오류가 발생할 수 있으며 일반적인 라이브러리에서 다른 라이브러리 버전을로드했기 때문에 예기치 않게 작동합니다 (로드 클래스의 일반적인 동작은 다음과 같습니다. 먼저 공통 클래스 로더를 살펴보고 클래스가 웹 애플리케이션의 클래스를 찾지 못한다면). 일부 애플리케이션을 다른 서블릿 컨테이너 나 애플리케이션 서버로 옮기는 것이 얼마나 고통 스러울 지 언급하지 마십시오. 앞서 언급했듯이 maven을 사용하여 jar 종속성을 처리 할 수 ​​있으며 라이브러리의 균등 한 사용을 원한다면 모든 응용 프로그램에서 POM 상위 (maven 전문 용어)를 정의하십시오.

1

제 경험상 웹 컨테이너 자체로 라이브러리를 이동하여 웹 응용 프로그램간에 라이브러리를 공유 할 때 매우주의해야합니다.

WEB-INF/lib에 살도록 내버려 두어 전쟁이 스스로 이루어 지도록하십시오. (언젠가 당신이 기뻐할 것입니다).

maven 또는 Ant Ivy를 사용하여 공용 저장소에서 라이브러리 jar를 가져 오는 것이 좋습니다. 이것은 매우 유용하며 시나리오에서 문제가되지 않아야합니다.


편집 : - 글래스 피시에서 웹 서비스 계층 - 웹 컨테이너가 아닌 웹 응용 프로그램에 있어야 주목할만한 예외는 메트로 라이브러리입니다.