Maven : 라이브러리에서 추가 한 종속성을 재정의하는 방법


116

내 일반적인 문제는 다음과 같습니다.

내 프로젝트 P는 D의 버전 1.0.1에 의존하는 C에 의존하는 B에 의존하는 A에 의존합니다.

D 버전 1.0.1에 문제가 있으며 다른 모듈을 강제로 사용하고 싶습니다. D에 대한 종속성을 직접 추가하지 않았기 때문에 프로젝트의 POM에서 이것을 선언하는 방법을 모르겠습니다. D에 대한 종속성을 선언 한 것은 C입니다.

중요 :이 경우 버전뿐만 아니라 그룹 및 아티팩트도 변경됩니다. 따라서 종속성 버전을 재정의하는 문제가 아니라 모듈을 제외하고 다른 모듈을 포함하는 것입니다.

구체적인 경우 D는 1.0.1에 버그 가있는 StAX입니다 . 버그의 메모에 따르면 "stax-api-1.0.1 (maven GroupId = stax)을 stax-api-1.0-2 (maven GroupId = javax.xml.stream)로 대체하여 문제가 해결되었습니다." 그냥 시도하고 있어요.

따라서 D = stax : stax-api : jar : 1.0.1 및 C = org.apache.xmlbeans : xmlbeans : jar : 2.3.0

중요한 경우를 대비하여 maven 2.0.9를 사용하고 있습니다.

mvn dependency : tree "의 출력

mvn dependency:tree
[..snip..]
[INFO] +- org.apache.poi:poi-ooxml:jar:3.6:compile
[INFO] |  +- org.apache.poi:poi-ooxml-schemas:jar:3.6:compile
[INFO] |  |  +- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile
[INFO] |  |  |  \- stax:stax-api:jar:1.0.1:compile

내 프로젝트의 POM에서 "A"에 다음과 같은 종속성이 있습니다.

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.6</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.6</version>
</dependency>

미리 감사드립니다.

답변:


100

현재 pom에 버전을 지정하기 만하면됩니다. 여기에 지정된 버전이 다른 버전보다 우선합니다.

버전 강제 적용
A 버전은 특정 버전으로 현재 POM에서 선언 된 경우 항상 적용되지만, 전이 종속성 사용에 의존하는 경우 다른 poms 다운 스트림에도 영향을 미친다는 점에 유의해야합니다.


자원 :


5
D에 대한 종속성을 선언하지 않았기 때문에 버전을 지정하는 방법이 명확하지 않습니다. 또한 제공 한 첫 번째 링크에는 "이 문서는 Maven 2.0에 대해 아직 구현되지 않은 종속성 관리에 대한 나머지 요구 사항을 설명합니다. 특히 전 이적 종속성과 관련하여. " 상단에.
wishihadabettername

@wishihadabettername, 다른 문서에서 말했듯이 : "A의 D 2.0에 대한 종속성을 명시 적으로 추가하여 D 2.0을 사용하도록 강제 할 수 있습니다."
Colin Hebert

1
실제로 자신의 pom에서 매우 동일한 <dependency> 항목을 복제합니다. 종속성에서 원하는 <버전>을 지정하십시오. 이는 "더 깊은"종속성에서 사용되는 모든 버전을 재정의합니다.
Keith Tyler

27

또는 원하지 않는 종속성을 제외 할 수도 있습니다. STAX는 JDK 1.6에 포함되어 있으므로 1.6을 사용하는 경우 완전히 제외 할 수 있습니다.

아래의 예는 약간 잘못되었습니다. 두 가지 제외 중 하나만 필요하지만 어느 것이 있는지 잘 모르겠습니다. 다른 버전의 Stax가 떠 다니는 경우가 있습니다. 아래의 예에서는 C와 D를 가져온 B를 가져 왔으며 각각 (아직 더 전이적인 종속성을 통해) Stax의 다른 버전을 가져 왔습니다. 그래서 'A'에 대한 의존성에서 두 버전의 Stax를 모두 제외했습니다.

<dependency>
  <groupId>a.group</groupId>
  <artifactId>a.artifact</artifactId>
  <version>a.version</version>
  <exclusions>
    <!--  STAX comes with Java 1.6 -->
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>javax.xml.stream</groupId>
    </exclusion>
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>stax</groupId>
    </exclusion>
  </exclusions>
<dependency>

1
이 전 이적 종속성을 사용할 수 있으며 필요한 경우 제외로 인해 빌드 실패가 발생할 수 있습니다.
Bernhard Colby

최신 JDK (예 : 1.6+)를 사용하고 있고 전이 종속성을 통해 포함 된 훨씬 더 오래된 stax 버전이 필요한 경우 모든 종류의 끔찍한 런타임 클래스 로더 문제에 직면하게 될 것입니다. 내 조언 : JDK에있는 것을 사용하십시오. "빌드 실패"가 발생하면 업그레이드해야하는 오래된 API를 사용하는 것입니다. 또는 : JDK를 1.5로 롤백하십시오. 좋은 결과 내길 바랄 게.
스콧

11

안에 넣은 것 </dependencies>루트 pom 태그 것은 루트 pom의 모든 자식 모듈에 포함됩니다. 모든 모듈이 해당 종속성을 사용하는 경우 이것이 갈 길입니다.

그러나 하위 모듈 10 개 중 3 개만 일부 종속성을 사용하는 경우이 종속성이 모든 하위 모듈에 포함되는 것을 원하지 않습니다. 이 경우 종속성을 </dependencyManagement>. 이렇게하면 종속성이 필요한 모든 자식 모듈이 자신의 pom 파일에서 선언해야하지만 </dependencyManagement>태그에 지정된 것과 동일한 버전의 종속성을 사용하게됩니다 .

또한을 사용하여 </dependencyManagement>전이 종속성에 사용되는 버전을 수정할 수 있습니다 . 왜냐하면 최상위 pom 파일에 선언 된 버전이 사용될 버전이기 때문입니다. 이는 프로젝트 A에 다른 외부 프로젝트 C v1.0을 포함하는 외부 프로젝트 B v1.0이 포함 된 경우 유용 할 수 있습니다. 때때로 v1.1에서 수정 된 프로젝트 C v1.0에서 보안 위반이 발견되는 경우가 발생하지만 B 개발자는 C의 v1.1을 사용하도록 프로젝트를 업데이트하는 속도가 느립니다.이 경우 간단히 선언 할 수 있습니다. `안에있는 프로젝트의 루트 pom에서 C v1.1에 의존하고 모든 것이 좋을 것입니다 (B v1.0이 여전히 C v1.1로 컴파일 할 수 있다고 가정).


10

또한 타사 라이브러리의 종속성을 무시하는 데 어려움이있었습니다. 나는 제외와 함께 scot의 접근 방식을 사용했지만 pom의 최신 버전과의 종속성도 추가했습니다. (Maven 3.3.3을 사용했습니다.)

따라서 stAX 예제의 경우 다음과 같습니다.

<dependency>
  <groupId>a.group</groupId>
  <artifactId>a.artifact</artifactId>
  <version>a.version</version>
  <exclusions>
    <!--  STAX comes with Java 1.6 -->
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>javax.xml.stream</groupId>
    </exclusion>
    <exclusion>
      <artifactId>stax-api</artifactId>
      <groupId>stax</groupId>
    </exclusion>
  </exclusions>
<dependency>

<dependency>
    <groupId>javax.xml.stream</groupId>
    <artifactId>stax-api</artifactId>
    <version>1.0-2</version>
</dependency>

1

받아 들여진 대답은 맞지만 2 센트를 더하고 싶습니다. 프로젝트 B가 종속성으로있는 프로젝트 A가있는 문제에 직면했습니다. 두 프로젝트 모두 slf4j를 사용하지만 프로젝트 B는 log4j를 사용하고 프로젝트 A는 logback을 사용합니다. 프로젝트 B는 slf4j 1.6.1을 사용하고 프로젝트 A는 slf4j 1.7.5를 사용합니다 (이미 포함 된 logback 1.2.3 종속성으로 인해).

문제 : 프로젝트 A가 slf4j 1.7.5에 존재하는 함수를 찾을 수 없었습니다. Eclipse의 종속성 계층 구조 탭을 확인한 후 빌드 중에 logback의 slf4j 1.7.5를 사용하는 대신 프로젝트 B에서 slf4j 1.6.1을 사용하고 있음을 발견했습니다. .

프로젝트 A pom에 대한 종속성 순서를 변경하여 문제를 해결했습니다. 프로젝트 B 항목을 로그 백 항목 아래로 이동 한 다음 maven이 slf4j 1.7.5를 사용하여 프로젝트를 빌드하기 시작했습니다.

편집 : 프로젝트 B 종속성이 작동하기 전에 slf4j 1.7.5 종속성 추가.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.