내 일반적인 문제는 다음과 같습니다.
내 프로젝트 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>
미리 감사드립니다.
답변
현재 pom에 버전을 지정하기 만하면됩니다. 여기에 지정된 버전이 다른 버전보다 우선합니다.
버전 강제 적용
A 버전은 특정 버전으로 현재 POM에서 선언 된 경우 항상 적용되지만, 전이 종속성 사용에 의존하는 경우 다른 poms 다운 스트림에도 영향을 미친다는 점에 유의해야합니다.
자원 :
답변
또는 원하지 않는 종속성을 제외 할 수도 있습니다. 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>
답변
안에 넣은 것 </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로 컴파일 할 수 있다고 가정).
답변
또한 타사 라이브러리의 종속성을 무시하는 데 어려움이있었습니다. 나는 제외와 함께 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>
답변
받아 들여진 대답은 맞지만 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 종속성 추가.