문제

이것은 일반적인 문제입니다. 2 개의 라이브러리를 사용하고 있습니다 조금 열려져 그리고 B. 자르 그리고 이것들은 동일한 항아리의 다른 버전에 따라 다릅니다.
런타임에 필요하다고 가정 해 봅시다 this.xxxjar

MY.jar   
     -> A.jar -> THIS.1.0.0.jar
     -> B.jar -> C.jar -> THIS.5.0.0.jar

특정 JAR (a.jar/b.jar)을 종속성에 대해 컴파일 할 수 있지만 런타임에는 1 버전 만로드해야합니다. 어느 것?
1 개의 종속성 (최신 버전) 만로드한다는 것은 라이브러리가 뒤로 호환되지 않으면 내 코드가 런타임 예외를 던질 수 있음을 의미합니다 (뒤로 호환 가능한 라이브러리가 있습니까?).

어쨌든 나는 Osgi와 같은 것이이 문제를 해결할 수 있다는 것을 알고 있습니다.
이런 종류의 문제를 해결하는 오래된 방법이 무엇인지 궁금합니다 ...

정말 감사합니다

도움이 되었습니까?

해결책

당신이 언급 한 "오래된 방법"(그리고 OSGI가 확실히 후드 아래에서 사용하는 것은)의 종속성의 두 분기에 대한 클래스 로더를 설치하는 것입니다. 예를 들어, 애플리케이션 서버는 동일한 JVM 내에서 동일한 응용 프로그램의 이전 및 최신 버전을 모두 실행할 수 있습니다.

클래스 로더 계층 구조에 대해 읽으십시오.

설정에서 까다로운 부분은 두 지점의 클래스가 만나는 공동 포인트입니다. 어느 분기도 다른 분야에 다른 분야에로드 된 클래스를 사용할 수 없습니다. 그것을 작동시키는 방법은 부팅 클래스 로더 (JRE 클래스) 또는 my.jar의 클래스로드로로드 된 클래스 만 두 가지로 전달되도록하는 것입니다.

다른 팁

OSGI는이 문제를 해결할 수 있습니다. OSGI 번들은 추가 메타 데이터 디테일 버전이있는 항아리에 지나지 않습니다. 번들에는 버전 번호가 있으며 종속 항아리의 버전 번호 (또는 범위)를 자세히 설명합니다.

보세요 이 입문 Javaworld 기사 자세한 내용은.

OSGI없이 이것을 해결한다는 것은 호환 가능한 항아리로 컴파일하고 실행하도록 수동으로 보장해야한다는 것을 의미합니다. 당신이 발견했듯이 그것은 반드시 사소한 일이 아닙니다. 항아리는 반드시 버전을 식별 할 필요는 없기 때문에 체크섬이나 서명을 기록/비교하기 위해이를 수행하는 유일한 방법입니다.

많은 라이브러리가 뒤로 호환됩니다. 그러나 전부는 아닙니다 ..


오래된 방법은 하나의 버전만으로 의존하는 것입니다.

동일한 버전 (최신)으로 컴파일하는 것이 더 안전 할 것입니다.
최소한 런타임 오류 대신 컴파일 타임 오류가 발생합니다.

필요한 경우 이전 의존성과 함께 작동하는 라이브러리를 약간 수정할 수 있습니다 ...
소스에 대한 액세스가 필요합니다 ...


컴파일 타임 호환성이 올바른 런타임 동작을 보장하지는 않습니다. 한 단계입니다. 그러면 다음을 수행 할 수 있습니다.

  • 새 버전의 JAR에 대한 WhatsNew 파일을 읽으십시오.
  • 호환성 문제를보고하는 사용자를 위해 인터넷을 확인하십시오
  • Junits를 쓰십시오
  • 두 항의 코드를 비교하십시오

KLE에서 언급했듯이 기본 접근 방식은 최신 버전에 의존하는 것입니다. 보장은 없지만 대부분은 작동합니다. 아마도 가장 좋은 방법 (부풀어 오른 방법)은 Osgi를 사용하여 극복하는 것입니다.

기본 "Oldway"구현 체크 아웃을 참조하십시오 https://github.com/atulsm/elasticsearchclasslader

이는 Elasticsearch 클라이언트 사용의 백 워드 호환 버전을 처리하는 접근 방식을 제공합니다.

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