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-libApp-Core-lib프로젝트가 루트 프로젝트에 나열됩니다 ( 루트 의 패키징 유형을 참조하십시오. POM입니다).

  • App-UI-WAR에서 Lib1, lib2, Lib3을 종속성으로 지정할 필요가 없습니다. Maven은Transitive Dependency Mechanism 이러한 세부 사항을 관리합니다.