2014-01-09 4 views
1

내 의존성과 충돌하는 내장 된 종속성이있는 jarX를 사용하고 있으므로 클래스 로더를 작성하여 기본 클래스 로더에서 jarX의 종속성을 분리합니다.jar (클래스 아이덴티티 위기)를 분리하기위한 클래스 로더

jarX는 내 응용 프로그램의 클래스 경로를 벗어 났지만 jarX의 클래스를 사용하는 클래스는 클래스 경로에 있으므로 사용자 정의 클래스 로더를 통해 클래스를 인스턴스화 할 때 ClassCastException 형태의 클래스 ID를 JVM 내 클래스의 버전은 내 사용자 정의 클래스 로더에 의해로드 된 버전과 다른 것으로 간주됩니다.

this blog post 나는이 문제를 해결하는 것으로 보이는 반사를 통해 클래스로드 된 사용자 지정 클래스와 상호 작용함으로써 비슷한 문제를 해결했습니다.

단지 이것보다 쉬워야한다고 생각합니다. 누구든지이 문제를 해결할 더 좋은 방법을 알고 있습니까?

+0

현재 제가 생각할 수있는 가장 간단한 해결책은 jarX에서 요구하는 것과 동일한 버전의 필수 라이브러리를 사용하는 것입니다. 그러나 이는 특정 정책으로 인해 항상 가능한 것은 아닙니다. maven을 가지고 있다면 (jarX에서 필요로하는 특정 라이브러리를 제외하도록 지정하여 간섭 라이브러리를 사용할 수도 있습니다. 그러나 이것은 두 jar가 동일한 공통 인터페이스를 사용하는 경우에만 가능합니다. –

+0

문제는 임베디드되고 불완전한 (사용되지 않은 메소드가 누락되었습니다.) 문제가있는 클래스를 제거 할 수있게 해주지 만 그 솔루션은 내가 게으르다는 이유 때문에 부적절한 것으로 여겨지므로 여기에 깨졌습니다 classloader :) – h0zer

+0

당신은 어느 항아리가 충돌하고 전체 스택 추적을 게시했는지, 어떤 서버를 사용하고 있습니까? –

답변

0

가장 쉬운 방법은 jarX를 열어 문제가되는 클래스를 제거하고 완료하는 것입니다. 종속성을 JAR에 내장하는 것이 좋지 않은 경우가 있습니다. 단, JAR은 독립형 실행 가능 팻말로만 사용하기위한 것이 아닙니다. 라이브러리로 사용하기위한 JAR은 종속성을 포함하지 않아야합니다.

사람들이 자신의 JAR에서 타사 클래스를 패키지하는 것을 보았을 때, 일반적으로 좋은 생각이 아니며 그렇게하지 않는 것이 바람직하다는 것을 지적하는 것이 좋습니다. 프로젝트가 모든 의존성을 포함하여 실행 가능한 fat-jar를 제공한다면, 괜찮습니다. 그러나 그들이 제공하는 유일한 JAR이되어서는 안됩니다. 제 3 자 코드가없는 일반 JAR 또는 JAR 세트도 제공해야합니다. 드문 경우이지만 타사 코드가 수정되어 포함되어야하는 경우 원래 타사가 아닌 공급자의 패키지 네임 스페이스에서 수행해야합니다.

마지막으로 모듈 형 Java 응용 프로그램을 빌드하고 클래스 로더 격리를 처리하는 실제 솔루션의 경우 OSGi 구현 중 하나 또는 Jigsaw 프로젝트 중 하나를 확인하십시오.

0

jar이 무엇이고 겹치는 클래스는 무엇입니까? 전체 스택 추적과 함께 게시 할 수 있습니까? 이 tool을보십시오. WAR에서 중복 클래스 목록을 생성하기 위해 썼습니다. 동일한 크기의 중복을 제외하는 옵션이 있습니다.

  • 시도는 중복이 존재하는 이유의 사례 분석을 통해 사건을 수행하여 중복의 수를 줄이기 위해 :

    는이 문제를 해결하기 위해 수행 할 수있는 몇 가지 방법입니다. 전체 복제본 인 jar에 maven 제외를 추가하십시오.
  • 사용할 수있는 종속성이없는 동일한 jar의 버전이 있는지 확인하십시오. 어떤 jar는 it, xerces 등입니까?
  • 종속성이없는 jar가없는 경우 jarX와 겹치는 다른 jar를 제외하고 응용 프로그램이 여전히 작동하는지 확인할 수 있습니다. 즉, jar를 필요로하는 모든 구성 요소에는 jarX 라이브러리의 호환 버전이 있습니다.
  • 응용 프로그램을 필요한 라이브러리의 버전으로 각각 두 개의 WAR로 분리합니다.이 likelly있는 조치가 장기

    더 유지 보수해야 할 곳이 이전 조치가 작동하지 않는 경우 어떤

에서 라이브러리의 수를 줄일 수 있습니다 :

  • 열을 jar, 복제 클래스를 삭제하고 다른 이름으로 maven 저장소에 게시하십시오. jarX-patched
  • 패치되지 않은 ja 대신 패치 된 jar를 제공하도록 nexus를 구성 할 수 있습니다 투명하게

  • OSGI를 지원하는 컨테이너가 더 좋을 수도 있지만 개발을 위해 OSGI 컨테이너를 사용하지 않으면 응용 프로그램이 개발되지 않습니다.