2010-08-19 5 views
1

우리는 많은 FOSS/COTS 소프트웨어를 사용하는 Java 제품을 보유하고 있습니다. 우리의 많은 "외부"는 동일한 병 제품을 사용하지만 다른 버전을 사용합니다. 예를 들어, Ant 1.6.5와 Ant 1.7.0; 또는 여러 버전의 xerces. 내가 염려하는 점은 클래스 패스가 결합 된 순서를 변경하면 애플리케이션의 동작이 변할 수도 있고 더 나빠질 수도 있다는 것이다. 우리는 vbs 스크립트를 사용하여 각 제품의 클래스 경로에 대한 환경 변수를 설정 한 다음 해당 환경 변수를 참조하는 Ant xml 파일을 설정합니다.어떻게 여러 개의 jar 버전을 FOSS/COTS로 많이 처리합니까?

그래서, 몇 가지 질문 :

  1. 어떻게 이렇게 많은 다른 외관을 사용할 때이 같은 항아리의 여러 버전을 관리합니까? 확실하게 나는 모든 유일한 항아리를 찾아서 하나의 큰 클래스 패스에 놓을 수 없다.
  2. 빌드 의존성 (및 클래스 경로)을 함께 사용하는 더 효과적인 방법이 있습니까?

하나의 긍정적 인 단계는 와일드 카드를 사용하여 모든 병을 잡을 계획입니다. 그러나 그것은 제가 주로 염려하는 수입 주문 문제입니다.

참고 : 메신저를 쏘지 마십시오. 이 시스템은 몇 년 전에 제가 여기 오기 훨씬 전에 설치되었습니다. 나는 그냥 청소부 야.

답변

5

메이븐. 잠시 시간을 내서 알아 내고 설정하면되지만 작동하면 꽤 마술입니다.

당신은 당신의 개미 빌드로 명시 적으로 버전 종속성에 Ivy를 추가 할 수 http://maven.apache.org/download.html

+0

Maven과 같은 사운드가 최상의 솔루션입니다. 우리가이 제품의 수명이 다해 가고 있지 않다면 바로 뛰어들 것입니다.이 시점에서 완전한 스위치를 정당화 할 수 있는지는 알 수 없습니다. 하지만 어쩌면 다음 번에 이력서 작성자가 될 정도로 충분히 파고들 수 있습니다.) 감사합니다! – Dave

+0

maven에 새로운 것들을 삽입하는 것을 시작하십시오. 수명주기 제품의 끝이 아직 사용 중일 때 5 년 안에, 당신은 그것을 아주 빨리 변환 할 수있을 것입니다. :) – bwawok

1

를 참조하십시오. 클래스 패스를 만들 때 동일한 라이브러리의 여러 버전이없는 상황을 위해 노력할 것을 제안합니다. 우리는 IDE가 전이 의존성을 사용하여 클래스 패스를 구축하는 매우 성가신 행동을했지만 유닉스 클래스 패스를 알파벳 순으로 만들어 Saxon/Xalan JavaMail/Genronimo-JavaMail 중 하나가 코드를 실행 한 위치에 따라로드되도록했습니다.

다른 답변에서 언급했듯이 빌드 시스템을 다시 작업 할 시간이 있다면 maven을 살펴 봐야합니다.

나는 당신을 아주 같은 클래스 로더의 모든 항아리를 넣어야 할 경우 다음 종속의 집합을 결정하기 위해 받는다는 사용할 수 있습니다, 빌드 환경

2

을 유지 존 스마트하여이 talk있다. 이렇게하면 종속성 집합에 필요한 각 라이브러리의 최신 버전이 선택됩니다. (예 : Ant 1.7.0이 선택되며 1.6.5는 선택되지 않습니다.)이 스키마는 라이브러리가 이전 버전과 역방향 호환되지 않는 한 잘 작동합니다. 따라서 종속성을 변경할 때 앱의 관련 기능/기능을 테스트하는 것이 좋습니다.

라이브러리가 인터페이스와 구현으로 분리 될 수있는 경우에만 가능한 대안은 공용 클래스 로더에 인터페이스를로드하고 사용자 정의 클래스 로더에 구현 + 종속성을로드하는 것입니다. 이렇게하면 각 클래스에 자체 클래스 로더를 부여하여 각 종속성을 분리합니다. 이것은 본질적으로 OSGi의 기능입니다.

+0

Maven을 사용하여 Maven을 결정하는 방법을 설명하는 TFM을 가르쳐 주시겠습니까? 의존성의 집합? 미안, 나는 단지 완전한 Maven 멍청 아. – Dave

+0

maven이이를 자동으로 수행하므로 종속성 해결이라고합니다. war 플러그인과 같이 의존성이있는 코드를 패키지하는 다양한 플러그인이 있습니다. 종속성 플러그인을 사용하여 종속성을 명시 적으로 복사 할 수 있습니다. http://maven.apache.org/plugins/maven-dependency-plugin/ – mdma

+0

굉장한 정보. 무리 감사! – Dave

0

이것은 OSGi가 해결하도록 설계된 것입니다. 애플리케이션에 동일한 jar의 여러 독립 버전이 있습니다.

+0

그 문장 하나가 완전히 맞을 수도 있습니다. 그럼에도 불구하고 그 분야의 초보자가 어느 방향으로 시작해야하는지에 대한 아이디어를 얻을 수는 없습니다. 내 말은, 원래 포스터가 모든 OSGI 사양을 읽기 시작할 것이라고 기대하지 않는 것입니까? 그래서 좀 더 자세한 포인터가 있습니까? – Bananeweizen

1

메이븐 (Maven)이나 아이비 (Ivy)를 사용하면 실제 문제를 해결할 수 있을지 모르겠습니다. 그들은 의존성 선언을 정리할 수 있지만 충돌에 대해서는 아무 것도하지 않을 것입니다.동일한 라이브러리의 서로 다른 두 버전을으로 출하해야하는 경우 (라이브러리가 역방향 호환되지 않는 경우 최신 버전 사용이 반드시 작동하지 않을 수 있으므로) jarjar을 사용하여 두 패키지가 서로 다른 패키지 이름을 가진 라이브러리를 다시 패키지 할 수 있습니다. 필요한 경우로드하십시오.

+0

이와 같은 항아리를 재 포장하면 라이센스 계약이 깨지십니까? 나는 우리 뒤에 오는 솜털 모양을 원하지 않는다. 법무 부서에 그 사실을 설명해야합니다. – Dave

+0

@Dopyii 상업용 JAR에 대해서는 잘 모릅니다 만 Apache/BSD 라이선스가있는 오픈 소스를 수정하는 데 문제가 있어서는 안됩니다. –

+0

정보 Dan에 감사드립니다! – Dave

관련 문제