Maven - 의존성 충돌 해결 전략

의존성 충돌 발생 원인 및 해결 방식

모듈 간 의존성 관계가 중첩될 경우, 동일한 라이브러리의 서로 다른 버전이 동시에 포함되어 충돌이 발생할 수 있습니다. 특히 상속 구조를 통해 의존성을 공유할 때 이러한 문제가 자주 나타납니다.

Maven은 다음과 같은 두 가지 규칙을 통해 의존성 충돌을 자동으로 해결합니다:

  • 경로 최단화 우선 (Shortest Path Priority): 여러 경로로 동일한 라이브러리에 접근할 경우, 더 짧은 경로를 선택합니다.
  • 선언 순서 우선 (First Declaration Wins): 경로 길이가 같을 경우, pom.xml에서 먼저 선언된 의존성이 우선 적용됩니다.

예제 시나리오: 모듈 간 의존성 계층 구조

다음과 같은 네 개의 프로젝트를 기반으로 분석합니다:

  • aaa: commons-io 2.6 사용
  • bbb: aaa를 의존하고, 자체적으로 commons-io 2.2 사용
  • ccc: bbb를 의존
  • ddd: aaabbb 모두 의존하며, aaa 먼저 선언

aaa 프로젝트 구성

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>testDep.AAA</groupId>
  <artifactId>aaa</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>
  </dependencies>
</project>

bbb 프로젝트 구성

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>testDep.BBB</groupId>
  <artifactId>bbb</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>testDep.AAA</groupId>
      <artifactId>aaa</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.2</version>
    </dependency>
  </dependencies>
</project>

ccc 프로젝트 구성

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>testDep.CCC</groupId>
  <artifactId>ccc</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>testDep.BBB</groupId>
      <artifactId>bbb</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
  </dependencies>
</project>

ddd 프로젝트 구성

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>testDep.DDD</groupId>
  <artifactId>ddd</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>testDep.AAA</groupId>
      <artifactId>aaa</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>testDep.BBB</groupId>
      <artifactId>bbb</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
  </dependencies>
</project>

의존성 분석 결과

  • cccbbbcommons-io 2.2 (최단 경로 우선 적용)
  • dddaaacommons-io 2.6 (선언 순서가 앞서므로 우선 적용)

태그: maven 의존성 관리 commons-io pom.xml 충돌 해결

7월 16일 01:04에 게시됨