2010-01-19 2 views
7

Eclipse 환경에서 프로젝트 A 또는 프로젝트 B와 C에 대한 종속성이 있습니다 (프로젝트 또는 라이브러리 인 경우 차이가 없음). B LibX.v1에 대한 의존성을 가지며 C에는 LibX.v2에 대한 종속성이 있습니다. 런타임 중에 A에 B.jar 및 C.jar가 필요합니다. 또한 B.jar의 클래스에는 LibX.v1이 필요하고 C.jar의 클래스에는 LibX.v2가 필요합니다. 동일한 라이브러리의 다른 버전 인 LibX.v1과 LibX.v2는 동일한 클래스를 가지므로 런타임에 잘못된 버전의 라이브러리에서 클래스를로드하여 많은 문제를 일으킬 수 있습니다. 이러한 상황을 어떻게 관리합니까?Java 및 Eclipse에서 라이브러리의 여러 버전에 대한 종속성 관리

종류가 레프 정말

+1

조언 - 당신이 그것을 처리 할 수 ​​있다는 것을 확신 할 수 없다면 OSGi에 들어 가지 마십시오. 그것은 단지 "여러 버전의 의존성"이상입니다. – Bozho

답변

4

에게 안부, 당신은하지 않습니다. 대부분의 Java 클래스 로더는 라이브러리가로드되는 순서에 대해 어떠한 보장도하지 않으므로 클래스 경로에 대한 종속성을 복제하지 않아야합니다. B 또는 C를 최신 버전으로 업데이트 할 수 있는지 또는 LibX가 완전히 하위 버전과 호환되는지 확인합니다.

편집 : 실제로 내가 당신을 도울 수있는 것을 발견했습니다. 그것은 OSGi라고 불 렸습니다, 그리고 저는 그것을 사용하지 않았지만 당신이하려고하는 것을 할 수있는 것처럼 보입니다. 소개 글에 link이 있습니다.

+0

실제로 OSGI가 유일한 방법 인 것 같습니다. 오픈 소스 프로젝트에서 작업하는 경우 매우 자주 발생하는 문제입니다. 나는 OSGI에 대해 진지하게 작업 할 것입니다. 감사! (사실 나는 이것을 발견했다는 소식을 업데이트하려고했다. http://stackoverflow.com/questions/1553567/java-classloader-how-to-reference-different-versions-of-a-jar) 감사합니다. Seref – mahonya

+0

classpath에있는 첫 번째 클래스는 JVM이 동일한 이름의 클래스를 더로드하지 못하도록합니다. 이는 보증으로 볼 수 있습니까? –

3

'다중 클래스 로더'메커니즘 (OSGI가 가능한 기능)을 사용해야합니다. 이러한 시나리오에서 클래스 B의 클래스 로더는 LibX.v1 만 볼 수 있고 클래스 로더 C는 LibX.v2 만 볼 수 있습니다. OSGI로 할 수 있지만 OSGI는 이보다 훨씬 더 많은 일이며 시작하기가 쉽지 않습니다.

다른 플러그인 프레임 워크는 JPF이며 복수 클래스 로더를 사용하는 것 이상을 제공합니다. 나는 그들이 플러그인 (모듈, 뭐든, ...) 당 1 클래스 로더의 원리를 사용한다고 생각한다.

어쩌면 classworlds을 보라. 나는이 도서관과 함께 할 수 있다고 생각한다. 이점은 클래스 로딩 측면에 집중한다는 것입니다. 문서가 좋지 않습니다. classworlds는 클래스 영역이라는 개념을 사용합니다. 사이트의 API 사용 예를 살펴보십시오. 하나를 찾으면 여기에 예제를 추가 할 것입니다. 어쨌든, 이것에 대한 사소한 해결책이 없다고 생각합니다.

의존성 관리로 해결하는 것이 최선의 해결책이지만, 항상 가능한 것은 아닙니다.

+0

안녕하세요 jpf 포인터 주셔서 감사합니다. 이 경우 나는 선택의 여지가별로 없다. 필자는 같은 라이브러리의 다른 버전에 대한 참조가있는 라이브러리를 보유하고 있습니다. 종속성 관리의 의미에 대해 통찰력을 줄 수 있다면 고맙겠습니다. 친절 관련 Seref – mahonya

+0

기본적으로 종속성 관리에서는 프로젝트가 의존하는 라이브러리를 선언 (구성) 할 수 있습니다.자세한 정보는 'maven'또는 'ivy'에 대한 검색을 수행하십시오. 프로젝트 및 종속성을 어떻게 관리합니까? JAR이 Eclipse 프로젝트에 저장되어 있습니까? 또한 두 프로젝트 모두 LibX의 다른 버전을 사용해야하는 특별한 이유가 있습니까? 그렇지 않으면 Ivy 또는 Maven으로 문제를 해결할 수 있습니다. LibX 버전을 하나만 사용하고 다른 버전은 제외 할 수 있기 때문입니다. –

관련 문제