0

는 I 2 개 가지 모듈 I는 C.종속성 버전 충돌을 해결하는 방법은 무엇입니까?

불리는 또 다른 모듈을 A 및 B라고 한 A는 C 버전을 사용

1.0

B는 C 버전을 사용하여 2.0

C 2.0이 아니기 때문에 문제는 이전 버전과의 호환성 - groupId와 artifactId 값이 C 1.0과 C 2.0에서 동일하더라도 pom.xml에서 이들 중 하나를 제외하고 A와 B에 대해 다른 하나를 사용할 수 없습니다. 따라서이 경우 제외 태그가 작동하지 않습니다 케이스. 특정 모듈에 종속성을 주입해야합니다.

OSGI를이 용도로 사용할 수 있다는 것을 알았지 만 작동하지 못했습니다. OSGI 자습서 나 다른 솔루션이 있다면 큰 도움이 될 것입니다.

+1

OSGi는이 경우 도토리를 크래킹하는 ** 엄청난 ** 슬레지 해머입니다. 종속성을 제외하고 원하는 특정 버전을 포함하십시오. –

+0

@BoristheSpider 단일 프로젝트에서 두 가지 버전의 패키지를 사용하는 방법이 있습니까? 패키지 A는 단순히 항아리 패키지이며, 수정해서는 안됩니다. 반면 C 2.0은 패키지 B에서 사용해야하는 새로운 기능을 지원합니다. – Mehmet

+1

다른 클래스 로더 사용에 대해 알고 있습니다 –

답변

1

OSGI를 사용하지 않으면 웹 응용 프로그램 서버에서 실행되는 경우 별도의 WAR 파일에서 A와 B를 실행하기 위해 응용 프로그램을 리팩토링 할 수 있습니다.

이렇게하면 WAR 1에는 A와 C 1.0이 포함되고 WAR 2에는 B와 C 2.0이 포함되며이 경우 간섭이 발생하지 않습니다.

+0

웹 응용 프로그램이 아닌 고전적인 Java 응용 프로그램입니다. AFAIK WAR 옵션은 서블릿에서만 사용할 수 있습니다. – Mehmet

+0

그런 다음 가능한 경우 두 개의 개별 응용 프로그램으로 분할하는 대안이 있습니다. 그렇지 않으면 응용 프로그램이 C의 다른 번들 버전에 의존하는 두 개의 번들 인 OSGI 컨테이너에서 실행하는 것이 좋습니다. 번들 C 번들을 사용할 수없는 경우 직접 Apache Karaf 경량 OSGI 컨테이너 https://karaf.apache.org/를 살펴보십시오. –

1

프로젝트 A 및/또는 B에서 Maven Shade pluginrelocation으로 시도하십시오. 프로젝트에 C 클래스가 포함됩니다. 그리고 C는 다른 패키지 경로를 얻으므로 더 이상 클래스 충돌이 발생하지 않습니다.

관련 문제