우아한 프로그래밍
article thumbnail

메이븐 의존성 우선순위를 왜 알아야 할까?


우리는 수많은 의존성을 관리하기 위해서 메이븐을 사용합니다.

그냥 우리는 필요한 라이브러리를 쭉 적어나갑니다. 

그러면 메이븐은 알아서 의존성을 자동으로 다운로드 하고 빌드하고 배포해줍니다.

그런데 만약 똑같은 라이브러리가 2개가 존재한다면 과연 메이븐은 어떤 라이브러리를 우선 채택하게될까요?

개발자가 의도하지않게 다른 버전이 사용되고 있을 수 있는겁니다.

즉 우리가 의존성을 좀더 정확하게 사용하기 위해서는 메이븐의 의존성 우선순위를 정확하게 이해해야합니다.

 

의존성 우선순위 조회 방법


... 생략

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>18.0</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>1.8.7</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.8.7</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>3.8.7</version>
</dependency>

... 생략

 

자 위와같이 pom.xml에 디펜던시를 기술하였습니다.

그러면 같은 아이디의 디펜던시이기 때문에 과연 어떤 버전의 jacson-core 라이브러리가 참조 될까요?

보통의 다른 설정 패턴에서는 가장 마지막에 나오는 것들의 덮어 씌우는 패턴이 많습니다.

하지만 메이븐에서는 가장 위에 있을 수록( 의존성트리의 최상단에 가까울수록) 우선순위가 높습니다.

그리고 주의 해야 할 점은 실제 설정파일에서는 보이지 않습니다만

맨 위에 있는 guava 라이브러리가 의존성으로 jackson-core 의존성을 가지고 있다면 

실제로 적용되는 의존성은 guava가 가지고있는 jackson-core 입니다.

자 그럼 여기서 의문이 듭니다.  

눈에 보이지 않는데 어떻게 찾을 수 있나요? 라이브러리를 일일히 까볼 수도 없구요.

우리는 어떻게 디펜던시를 쉽게 파악하고 핸들링 할 수있을까요?

이클립스에서는 아래 그림처럼 pom.xml을 클릭하면 나오는 디펜던시 상속모델을 통해서 조회 해 볼 수있습니다.

필터 검색을 통해서 가장 위에 있는 의존성이 우선순위가 높습니다.

 

이클립스에서 의존성 트리 조회 방법

 

인텔리J에서 의존성 트리 조회 방법

인텔리 J에서는 Maven Helper라는 플러그인을 설치해야 합니다.

설치후 pom.xml 파일을 누르고 빨간색 체크박스를 클릭하면 조회 가능합니다.

 

CLI에서 의존성 조회 방법

이클립스나 Intelij가 없는 단순 CLI에서는 mvn dependency:tree 명령어를 통해서 아래와같이 조회해볼수있습니다.

$ 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] ------------------------------------------------------------------------
$
profile

우아한 프로그래밍

@자바조아!

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!