웹사이트 검색

Maven 종속성 트리 - 충돌 해결


Maven 종속성 트리는 프로젝트 종속성을 이해하고 다양한 버전의 종속성으로 인한 충돌을 해결하는 데 매우 유용합니다.

프로젝트의 Maven 종속성 트리를 얻는 방법

터미널에서 mvn dependency:tree 명령을 실행하여 프로젝트 종속성 트리를 인쇄할 수 있습니다. 이 예에서는 GitHub 리포지토리를 사용합니다. 우리는 프로젝트 종속성에만 관심이 있습니다. pom.xml은 다음 프로젝트 종속성을 선언했습니다.

<dependencies>
	<dependency>
		<groupId>org.junit.platform</groupId>
		<artifactId>junit-platform-runner</artifactId>
		<version>1.2.0</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.junit.jupiter</groupId>
		<artifactId>junit-jupiter-engine</artifactId>
		<version>5.2.0</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.mockito</groupId>
		<artifactId>mockito-junit-jupiter</artifactId>
		<version>2.19.0</version>
		<scope>test</scope>
	</dependency>
	<!-- TestNG Dependencies -->
	<dependency>
		<groupId>org.testng</groupId>
		<artifactId>testng</artifactId>
		<version>6.14.3</version>
		<scope>test</scope>
	</dependency>
</dependencies>

maven 종속성 트리 명령을 실행할 때의 출력을 봅시다.

$ mvn dependency:tree                                                              
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------------
[INFO] Building Mockito-Examples 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
[INFO] com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
[INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test
[INFO] |  +- org.apiguardian:apiguardian-api:jar:1.0.0:test
[INFO] |  +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test
[INFO] |  +- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test
[INFO] |  |  \- org.junit.platform:junit-platform-commons:jar:1.2.0:test
[INFO] |  \- junit:junit:jar:4.12:test
[INFO] |     \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
[INFO] |  +- org.junit.platform:junit-platform-engine:jar:1.2.0:test
[INFO] |  |  \- org.opentest4j:opentest4j:jar:1.1.0:test
[INFO] |  \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test
[INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
[INFO] |  \- org.mockito:mockito-core:jar:2.19.0:test
[INFO] |     +- net.bytebuddy:byte-buddy:jar:1.8.10:test
[INFO] |     +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test
[INFO] |     \- org.objenesis:objenesis:jar:2.6:test
[INFO] \- org.testng:testng:jar:6.14.3:test
[INFO]    +- com.beust:jcommander:jar:1.72:test
[INFO]    \- org.apache-extras.beanshell:bsh:jar:2.0b6:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.871 s
[INFO] Finished at: 2019-12-13T12:24:11+05:30
[INFO] ------------------------------------------------------------------------
$

출력에는 이 애플리케이션을 실행하는 데 사용되는 모든 JAR이 표시됩니다. 출력에는 종속성 groupId, artifactId, 패키징, 버전 및 범위가 표시됩니다.

Maven 프로젝트 종속성에서 종속성 제외

위의 종속성 트리 출력을 보면 JUnit 4 JAR이 junit-platform-runner의 전이적 종속성으로 풀링되고 있습니다. 테스트 케이스 작성에 JUnit 5를 사용할 계획이라면 충돌을 피하기 위해 종속성에서 JUnit 4를 제외하는 것이 좋습니다. 제외 태그를 사용하여 프로젝트 종속성에서 JUnit 4 JAR을 제외할 수 있습니다. 끌어오기를 담당하는 종속성에 추가해야 합니다.

<dependency>
	<groupId>org.junit.platform</groupId>
	<artifactId>junit-platform-runner</artifactId>
	<version>1.2.0</version>
	<scope>test</scope>
	<exclusions>
		<exclusion>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
		</exclusion>
	</exclusions>
</dependency>

종속성 트리 명령을 다시 실행해 보겠습니다. 이제 JUnit 4 JAR이 표시되지 않아야 합니다.

Maven 종속성 트리 상세 모드를 사용하여 충돌 해결

Maven 프로젝트를 빌드할 때 프로젝트에 더 가까운 종속성 버전이 선택됩니다. 특정 버전을 원하지만 메이븐이 다른 버전을 선택하는 경우 문제가 발생할 수 있습니다. mvn dependency:tree -Dverbose 명령을 사용하여 종속성 충돌을 인쇄할 수 있습니다. JAR과의 비호환성 문제가 있는지 확인하는 데 도움이 될 수 있습니다.

$ mvn dependency:tree -Dverbose
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------------
[INFO] Building Mockito-Examples 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
[INFO] com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
[INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test
[INFO] |  +- org.apiguardian:apiguardian-api:jar:1.0.0:test
[INFO] |  +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test
[INFO] |  |  +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
[INFO] |  |  \- (org.junit.platform:junit-platform-engine:jar:1.2.0:test - omitted for duplicate)
[INFO] |  \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test
[INFO] |     +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
[INFO] |     \- org.junit.platform:junit-platform-commons:jar:1.2.0:test
[INFO] |        \- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
[INFO] |  +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
[INFO] |  +- org.junit.platform:junit-platform-engine:jar:1.2.0:test
[INFO] |  |  +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
[INFO] |  |  +- (org.junit.platform:junit-platform-commons:jar:1.2.0:test - omitted for duplicate)
[INFO] |  |  \- org.opentest4j:opentest4j:jar:1.1.0:test
[INFO] |  \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test
[INFO] |     +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
[INFO] |     +- (org.opentest4j:opentest4j:jar:1.1.0:test - omitted for duplicate)
[INFO] |     \- (org.junit.platform:junit-platform-commons:jar:1.2.0:test - omitted for duplicate)
[INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
[INFO] |  +- org.mockito:mockito-core:jar:2.19.0:test
[INFO] |  |  +- net.bytebuddy:byte-buddy:jar:1.8.10:test
[INFO] |  |  +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test
[INFO] |  |  \- org.objenesis:objenesis:jar:2.6:test
[INFO] |  \- (org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test - omitted for conflict with 5.2.0)
[INFO] \- org.testng:testng:jar:6.14.3:test
[INFO]    +- com.beust:jcommander:jar:1.72:test
[INFO]    \- org.apache-extras.beanshell:bsh:jar:2.0b6:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.018 s
[INFO] Finished at: 2019-12-13T12:58:07+05:30
[INFO] ------------------------------------------------------------------------
$

출력 라인(org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test - 5.2.0과의 충돌로 인해 생략됨)은 이 JAR 버전이 다른 버전을 위해 삭제되었음을 알려줍니다. junit-jupiter-api 버전 5.1.0을 사용하려면 프로젝트 maven 종속성에 추가하기만 하면 됩니다. Maven은 가장 근접한 승리 전략으로 버전 충돌을 해결하므로 직접적인 종속성은 항상 프로젝트에 포함됩니다.

Maven 종속성 트리 필터링

Maven 프로젝트에 종속성이 많으면 특정 아티팩트를 찾기가 어려워집니다.

- 딘클루즈

-Dincludes 옵션을 사용하여 출력에서 특정 종속성만 포함할 수 있습니다. 필터링 패턴의 구문은 [groupId]:[artifactId]:[type]:[version]입니다. 각 패턴 세그먼트는 선택 사항이며 전체 및 부분 * 와일드카드를 지원합니다.

$ mvn dependency:tree -Dverbose -Dincludes=org.junit.jupiter:junit-jupiter-api
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------------
[INFO] Building Mockito-Examples 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
[INFO] com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
[INFO] |  \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test
[INFO] \- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
[INFO]    \- (org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test - omitted for conflict with 5.2.0)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.981 s
[INFO] Finished at: 2019-12-13T13:04:04+05:30
[INFO] ------------------------------------------------------------------------
$

- 제외

종속성 트리 출력에서 지정된 종속성을 제거하는 데 사용됩니다. 패턴은 -Dincludes 옵션과 동일합니다. 쉼표를 사용하여 종속성 트리에서 포함하거나 제외할 여러 패턴을 지정할 수 있습니다.

$ mvn dependency:tree -Dexcludes=org.junit.jupiter:junit-jupiter-api 
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------------
[INFO] Building Mockito-Examples 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
[INFO] com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
[INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test
[INFO] |  +- org.apiguardian:apiguardian-api:jar:1.0.0:test
[INFO] |  +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test
[INFO] |  \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test
[INFO] |     \- org.junit.platform:junit-platform-commons:jar:1.2.0:test
[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
[INFO] |  \- org.junit.platform:junit-platform-engine:jar:1.2.0:test
[INFO] |     \- org.opentest4j:opentest4j:jar:1.1.0:test
[INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
[INFO] |  \- org.mockito:mockito-core:jar:2.19.0:test
[INFO] |     +- net.bytebuddy:byte-buddy:jar:1.8.10:test
[INFO] |     +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test
[INFO] |     \- org.objenesis:objenesis:jar:2.6:test
[INFO] \- org.testng:testng:jar:6.14.3:test
[INFO]    +- com.beust:jcommander:jar:1.72:test
[INFO]    \- org.apache-extras.beanshell:bsh:jar:2.0b6:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.925 s
[INFO] Finished at: 2019-12-13T13:55:22+05:30
[INFO] ------------------------------------------------------------------------
$ 

Eclipse IDE의 Maven 종속성 트리

Eclipse pom.xml "Dependency Hierarchy\ 탭은 프로젝트의 종속성 트리를 보여줍니다. 두 가지 측면이 있습니다. 왼쪽에는 자세한 출력이 표시되고 오른쪽에는 해결된 종속성이 표시됩니다. "Filter\ 옵션을 사용하여 찾을 수 있습니다. 특정 종속성.

추가 자료: Eclipse IDE에서 Maven 사용

종속성 트리를 파일에 저장

-DoutputFile 옵션을 사용하여 종속성 트리 출력을 저장할 파일을 지정할 수 있습니다.

$ mvn dependency:tree -DoutputFile=dependency-tree.txt
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------------
[INFO] Building Mockito-Examples 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
[INFO] Wrote dependency tree to: /Users/pankaj/Desktop/maven-examples/Mockito-Examples/dependency-tree.txt
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.862 s
[INFO] Finished at: 2019-12-13T15:27:51+05:30
[INFO] ------------------------------------------------------------------------
$
$ cat dependency-tree.txt 
com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
+- org.junit.platform:junit-platform-runner:jar:1.2.0:test
|  +- org.apiguardian:apiguardian-api:jar:1.0.0:test
|  +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test
|  \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test
|     \- org.junit.platform:junit-platform-commons:jar:1.2.0:test
+- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
|  +- org.junit.platform:junit-platform-engine:jar:1.2.0:test
|  |  \- org.opentest4j:opentest4j:jar:1.1.0:test
|  \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test
+- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
|  \- org.mockito:mockito-core:jar:2.19.0:test
|     +- net.bytebuddy:byte-buddy:jar:1.8.10:test
|     +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test
|     \- org.objenesis:objenesis:jar:2.6:test
\- org.testng:testng:jar:6.14.3:test
   +- com.beust:jcommander:jar:1.72:test
   \- org.apache-extras.beanshell:bsh:jar:2.0b6:test
$

참조

  • Maven 종속성 플러그인
  • 종속 트리를 사용하여 충돌 해결
  • 종속성 트리 필터링