Maven006-Maven 종속성 전달 및 종속성 충돌
[toc]
I. 의존성 전달
, 개요
- 개념:
- Maven 종속성 전달이란 프로젝트가 다른 프로젝트나 라이브러리에 종속된 경우 Maven이 해당 종속성을 자동으로 해결하고 가져와 프로젝트를 원활하게 빌드하고 실행할 수 있도록 하는 것을 의미합니다.
- 종속성 전달에는 직접 종속성과 간접 종속성이 포함됩니다. 직접 종속성은 프로젝트에서 직접 참조하는 라이브러리이고, 간접 종속성은 참조하는 다른 라이브러리에 직접적으로 의존 하는 라이브러리입니다.
- 역할:
- 프로젝트 관리 간소화: Maven은 종속성 전달을 통해 프로젝트 관리를 간소화합니다. 개발자는 직접 종속성을 선언하기만 하면 모든 간접 종속성을 해결하고 가져오는 작업을 Maven이 처리합니다.
- 버전 관리: Maven은 서로 다른 라이브러리 간의 버전 충돌을 관리하여 프로젝트가 올바른 버전을 사용하고 있는지 확인하여 충돌 및 불일치를 방지할 수 있습니다.
- 전송의 원리:
- 통과: Maven은 자동으로 종속성을 통과하여 필요한 라이브러리에 직접적으로 종속된 모든 간접 종속성도 해결하고 올바르게 가져옵니다.
- 최단 경로 우선: Maven은 가장 직접적이고 적절한 버전이 사용되도록 종속성을 해결하기 위해 최단 경로를 선택합니다.
- 충돌 해결:버전 충돌이 발생하면 Maven은 특정 규칙에 따라 이를 해결하며, 일반적으로 라이브러리의 가장 높은 버전을 선택합니다.
- 종속성 전달이 종료됩니다:
- 종속성 전달은 다른 종속성이 없는 가장 낮은 수준의 라이브러리에 도달할 때까지 계속됩니다. 종속성 전달을 종료하는 라이브러리를 리프 노드라고 합니다.
- 일반적으로 Java 표준 라이브러리는 더 이상 다른 라이브러리에 종속되지 않기 때문에 종속성 전달이 끝나는 곳입니다.
, 사례: 잭슨 의존성
의존성 소개
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://..org/POM/..0"
xmlns:xsi="http://..org/2100"/XMLSchema-instance"
xsi:schemaLocation="http://..org/POM/..0 http://..org/xsd/maven-...xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zibo</groupId>
<artifactId>mvn-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://.com/artifact/...core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.1</version>
</dependency>
</dependencies>
</project>
II. 의존성 충돌
, 개요
이유: 동일한 병 패키지가 직간접적으로 도입되었습니다!
충돌 해결: 자동으로 해결 가능, 수동으로 해결할 수 있지만 수동 해결은 권장하지 않습니다!
동일한 jar 패키지에 대한 직접 또는 간접 참조가 나타나는 경우! 이 경우 프로젝트에 동일한 중복 jar 패키지가 있으며, 이는 충돌로 간주됩니다! 의존성 충돌은 중복된 의존성을 피하고 의존성 전달을 종료합니다!
종속성 충돌을 자동으로 해결하는 Maven의 기능은 중복 종속성 선택에 대한 자체 원칙을 따릅니다. 수동 충돌 해결도 제공되지만 권장하지는 않습니다!
갈등 해결을 위한 두 가지 접근 방식
종속성 충돌 해결 접근 방식:
자동 선택의 원리
종속성 경로의 길이가 같으면 "먼저 선언된 것이 우선"입니다.
A->E->X(버전 0.0.1)
A->F->X(버전 0.0.2)
<depencies></depencies>에서는 동일한 경로로 먼저 선언된 것이 선호됩니다!
수동 제외
<dependency> <groupId>com.atguigu.maven</groupId> <artifactId>pro01-maven-java</artifactId> <version>1.0-SNAPSHOT</version> <scope>compile</scope> <!-- 제외 태그를 사용하여 의존성 제외를 구성합니다.> <exclusions> <!-- 제외 태그에서 특정 제외를 구성합니다.> <exclusion> <!-- 제외할 의존성의 좌표를 지정합니다.> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>




