Maven-종속성 관리
Maven의 핵심 기능 중 하나는 종속성 관리입니다. 다중 모듈 프로젝트 (수백 개의 모듈 / 하위 프로젝트로 구성됨)를 처리해야하는 경우 종속성 관리는 어려운 작업입니다. Maven은 이러한 시나리오를 관리하기위한 높은 수준의 제어 기능을 제공합니다.
전 이적 종속성 검색
A라는 라이브러리가 B와 같이 다른 라이브러리에 의존하는 경우는 꽤 자주 발생합니다. 다른 프로젝트 C가 A를 사용하려는 경우 해당 프로젝트도 라이브러리 B를 사용해야합니다.
Maven은 필요한 모든 라이브러리를 검색하기 위해 이러한 요구 사항을 방지하는 데 도움이됩니다. Maven은 종속성의 프로젝트 파일 (pom.xml)을 읽고 종속성을 파악하는 등의 작업을 수행합니다.
우리는 각 프로젝트 pom에서 직접적인 의존성을 정의하기 만하면됩니다. Maven이 나머지를 자동으로 처리합니다.
전 이적 종속성을 사용하면 포함 된 라이브러리의 그래프가 빠르게 크게 증가 할 수 있습니다. 중복 라이브러리가있는 경우 케이스가 발생할 수 있습니다. Maven은 전이 종속성의 범위를 제어하는 몇 가지 기능을 제공합니다.
Sr. 아니. | 기능 및 설명 |
---|---|
1 | Dependency mediation 여러 버전의 아티팩트가 발견 될 때 사용할 종속성 버전을 결정합니다. 두 종속성 버전이 종속성 트리에서 동일한 깊이에있는 경우 처음 선언 된 종속성이 사용됩니다. |
2 | Dependency management 전이 종속성에서 발견 될 때 사용할 아티팩트의 버전을 직접 지정하십시오. 예를 들어 프로젝트 C는 B를 종속성 관리 섹션에 종속성으로 포함하고 참조 될 때 사용할 B 버전을 직접 제어 할 수 있습니다. |
삼 | Dependency scope 빌드의 현재 단계에 따른 종속성을 포함합니다. |
4 | Excluded dependencies 전 이적 종속성은 "exclusion"요소를 사용하여 제외 할 수 있습니다. 예를 들어 A는 B에 종속되고 B는 C에 종속되며 A는 C를 제외됨으로 표시 할 수 있습니다. |
5 | Optional dependencies 전 이적 종속성은 "선택 사항"요소를 사용하여 선택 사항으로 표시 할 수 있습니다. 예를 들어 A는 B에 의존하고 B는 C에 의존합니다. 이제 B는 C를 선택 사항으로 표시했습니다. 그러면 A는 C를 사용하지 않습니다. |
종속성 범위
Transitive Dependency Discovery는 아래와 같이 다양한 Dependency Scope를 사용하여 제한 할 수 있습니다.
Sr. 아니. | 범위 및 설명 |
---|---|
1 | compile 이 범위는 프로젝트의 클래스 경로에서 종속성을 사용할 수 있음을 나타냅니다. 기본 범위입니다. |
2 | provided 이 범위는 런타임시 JDK 또는 웹 서버 / 컨테이너가 종속성을 제공함을 나타냅니다. |
삼 | runtime 이 범위는 종속성이 컴파일에 필요하지 않지만 실행 중에 필요함을 나타냅니다. |
4 | test 이 범위는 종속성이 테스트 컴파일 및 실행 단계에서만 사용 가능함을 나타냅니다. |
5 | system 이 범위는 시스템 경로를 제공해야 함을 나타냅니다. |
6 | import 이 범위는 종속성이 pom 유형 인 경우에만 사용됩니다. 이 범위는 지정된 POM이 해당 POM의 <dependencyManagement> 섹션에서 종속성으로 대체되어야 함을 나타냅니다. |
의존성 관리
일반적으로 공통 프로젝트 아래에 일련의 프로젝트가 있습니다. 이 경우 모든 공통 종속성을 갖는 공통 pom을 만든 다음이 pom을 하위 프로젝트 poms의 부모로 만들 수 있습니다. 다음 예는이 개념을 이해하는 데 도움이됩니다.
다음은 위의 종속성 그래프의 세부 사항입니다.
- App-UI-WAR는 App-Core-lib 및 App-Data-lib에 따라 다릅니다.
- Root는 App-Core-lib 및 App-Data-lib의 부모입니다.
- 루트는 종속성 섹션에서 Lib1, lib2, Lib3을 종속성으로 정의합니다.
App-UI-WAR
<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>com.companyname.groupname</groupId>
<artifactId>App-UI-WAR</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Core-lib</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
App-Core-lib
<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">
<parent>
<artifactId>Root</artifactId>
<groupId>com.companyname.groupname</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Core-lib</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>
App-Data-lib
<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">
<parent>
<artifactId>Root</artifactId>
<groupId>com.companyname.groupname</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
</project>
Root
<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>com.companyname.groupname</groupId>
<artifactId>Root</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.companyname.groupname1</groupId>
<artifactId>Lib1</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname2</groupId>
<artifactId>Lib2</artifactId>
<version>2.1</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>com.companyname.groupname3</groupId>
<artifactId>Lib3</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
</project>
이제 App-UI-WAR 프로젝트를 빌드 할 때 Maven은 종속성 그래프를 탐색하고 애플리케이션을 빌드하여 모든 종속성을 발견합니다.
위의 예에서 다음과 같은 주요 개념을 배울 수 있습니다.
부모 pom의 개념을 사용하여 공통 종속성을 단일 위치에 배치 할 수 있습니다. 종속성App-Data-lib 과 App-Core-lib프로젝트가 루트 프로젝트에 나열됩니다 ( 루트 의 패키징 유형을 참조하십시오. POM입니다).
App-UI-WAR에서 Lib1, lib2, Lib3을 종속성으로 지정할 필요가 없습니다. Maven은Transitive Dependency Mechanism 이러한 세부 사항을 관리합니다.