2010-04-24 2 views
4

데이터를 텍스트 또는 바이너리 형식으로 쓰는 라이브러리가 있습니다. 그것은 다음과 같은 세 가지 구성 요소가 있습니다이 여러 개의 .jar 파일에 동일한 클래스 파일이 있습니다. 얼마나 나빴 니?

  • 텍스트 작가
  • 이진수 작가 (1에 따라 다름)

    1. 공통의 데이터 구조를

    이 같다 배포 할 수있는 확실한 방법을 (1에 따라 다름) 3 .jar 파일을 사용하므로 사용자는 필요한 내용 만 포함 할 수 있습니다. 나는 두 jar 파일을 생성하고 모두에서 공통 class 파일을 포함하여 고려 중이 야 있도록

    그러나, "일반적인 데이터 구조"구성 요소는 정말 두 개의 작은 클래스입니다.

    내 질문 :이 작업을 수행 할 때 발생할 수있는 잠재적 문제는 무엇입니까?

  • 답변

    1

    라이브러리의 새 버전을 릴리스하면 두 라이브러리를 사용하는 사용자 (이전 하나는 새 라이브러리)는 새 라이브러리가 기존 라이브러리에서 클래스를 가져올 때 런타임 예외가 발생할 수 있습니다. 이전 버전과 호환되지 않음). 가장 쉬운 방법은 하나의 항아리에서 모두를 릴리스하는 것입니다. 따라서이 버전 문제는 발생하지 않습니다.

    0

    잠재적 문제는이 두 jar 파일의 미래 데이터 구조 버전에서 일관성 얻을 수 있다는 점이다 (말 때문에 버그 수정 또는 부 릴리스). 이 경우, 양쪽 모두의 항아리를 어플리케이션에 포함 할 필요가있는 경우는 ClassDefNotFoundException를 취득 할 수 있습니다. 3 개의 jar 파일이나 하나의 큰 파일로 나눌 것을 권합니다.

    4

    언급 한 잠재적 버전 불일치 다른 사람은 실제로 당신이 다른 단지에 같은 클래스 (들)를 배포하는 경우가 직면 할 수 클래스 로딩 문제의 더 큰 세트 중 하나 경우입니다.

    클래스 로딩 버그는 클래스 로더의 계층 구조에 의해로드 된 여러 구성 요소 /있는 프로그램이 응용 프로그램 서버/EJB 컨테이너 또는 이와 유사한 설정, 당신을 물린 가능성이 높습니다. 그러나 같은 클래스가 두 개의 다른 클래스 로더에 의해로드되면 JVM에서 완전히 별개의 클래스로 간주됩니다! (같은 클래스 정의의 두 가지 버전이 충돌하는 경우 예를 들어 - 다른 답변에 설명 된대로) LinkageError 같은 다른 런타임 오류가 발생할 수 있습니다 등 (캐스트가 다른 클래스 로더에 의해로드 된 두 개의 클래스 정의 사이에 시도 된 경우), ClassCastException은 날 믿어 , 클래스로드 지옥은 당신이보고 싶지 않은 장소입니다.

    위험을 최소화하기 위해 전체 라이브러리를 단일 병에 넣을 것입니다. 나는 하나의 jar 파일에 jar 파일의 수를 포장하기위한 라이브러리입니다 JarJar을 사용하는 것이 좋습니다

    0

    .

    빌드 및 빌드 환경에 통합하기위한 Ant 태스크가 있으므로 원시 jar를 그대로 유지할 수 있으며 간단한 배포 만 할 수 있습니다 (그러나 배포판에 다양한 라이브러리의 license.txt 파일을 포함시켜야 함)).

    관련 문제