English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Maven 의존 관리

Maven의 핵심 기능 중 하나는 의존 관리입니다. 다중 모듈 프로젝트(数百上千个模块或者子项目)을 처리할 때, 모듈 간의 의존 관계가 매우 복잡해지고, 관리가 어려워집니다. 이러한 상황을 대비하여 Maven은 고도로 제어할 수 있는 방법을 제공합니다.

전달 가능한 의존 관계 발견

빈번하게 발생하는 한가지 상황을 생각해보면, 예를 들어 A가 다른 라이브러리 B에 의존합니다. 그런 다음, C 프로젝트가 A를 사용하려면, C 프로젝트도 라이브러리 B를 사용해야 합니다.

Maven은 모든 필요한 라이브러리를 검색할 필요가 없습니다. Maven은 프로젝트 파일(pom.xml)을 읽어서 그들 간의 의존 관계를 찾습니다.

해야 할 일은 각 프로젝트의 pom 파일에서 직접 의존 관계를 정의하는 것입니다. 다른 일들은 Maven이 도와줍니다.

전달 가능한 의존 관계를 통해 포함된 모든 라이브러리의 그래프가 빠르게 증가합니다. 중복 라이브러리가 있을 때, 발생할 수 있는 상황은 지속적으로 증가합니다. Maven은 전달 가능한 의존 관계의 정도를 제어하기 위한 몇 가지 기능을 제공합니다.

기능기능 설명
의존 조정여러 개의 수동으로 생성된 버전이 동시에 나타났을 때, 사용될 의존 버전은 어떤 것인지 결정합니다. 의존 트리에서 두 의존 버전의 깊이가 같을 때, 첫 번째로 선언된 의존 버전이 사용됩니다.
의존성 관리직접적으로 생성된 특정 버전이 사용됩니다. 예를 들어, 프로젝트 C가 자신의 의존성 관리 모듈에 프로젝트 B를 포함하면, B가 A에 의존하면 A는 B가 참조될 때 사용할 버전을 지정할 수 있습니다.
의존성 범위건설 과정의 각 단계에 포함된 의존성.
의존성 제외모든 전달 가능 의존성은 "exclusion" 요소를 사용하여 제외할 수 있습니다. 예를 들어: A가 B에 의존하며, B가 C에 의존합니다. 따라서 A는 C를 "제외된"으로 표시할 수 있습니다.
의존성 선택 가능모든 전달 가능 의존성은 "optional" 요소를 사용하여 선택 가능하게 표시될 수 있습니다. 예를 들어: A가 B에 의존하며, B가 C에 의존합니다. 따라서 B는 C를 선택 가능하게 표시할 수 있습니다. 이렇게 하면 A는 C를 사용하지 않을 수 있습니다.

의존성 범위

의존성 범위를 사용하여 의존성 발견을 제한할 수 있습니다. 예를 들어:

범위설명
컴파일 스테이지이 범위는 관련 의존성이 프로젝트의 클래스 경로에서만 유효하다는 것을 의미합니다. 기본 값.
공급 스테이지이 범위는 관련 의존성이 실행 시간의 JDK나 네트워크 서버에서 제공된다는 것을 의미합니다。
런타임 스테이지이 범위는 관련 의존성이 컴파일 단계에서는 필수적이지 않지만 실행 단계에서는 필수적이라는 것을 의미합니다。
테스트 스테이지이 범위는 관련 의존성이 테스트 컴파일 단계와 실행 단계에서만 유효하다는 것을 의미합니다。
시스템 스테이지이 범위는 시스템 경로를 제공해야한다는 것을 의미합니다。
импورت 스테이지이 범위는 의존성이 pom에서 정의된 의존성일 때만 사용됩니다. 동시에, 현재 프로젝트의 POM 파일의 부분에서 정의된 의존성은 특정 POM을 대체할 수 있습니다。

의존성 관리

일반적으로, 공통 프로젝트 아래에 여러 프로젝트가 있습니다. 이 경우, 모든 공통 의존성을 포함한 pom 파일을 생성할 수 있습니다. 이 pom 파일은 다른 서브 프로젝트 pom의 pom 부모로 불립니다. 다음 예제는 이 개념을 더 잘 이해하는 데 도움이 됩니다。

위 의존성 그래프의 자세한 설명은 다음과 같습니다:

  • App-UI-WAR은 App에 의존합니다。-Core-lib와 App-Data-lib입니다。

  • Root는 App-Core-lib와 App-Data-lib의 부모 프로젝트입니다。

  • Root는 그 의존성 부분에서 Lib를 정의했습니다。1、lib2 와 Lib3 의 의존성으로 사용됩니다。

App-UI-WAR의 pom.xml 파일 코드는 다음과 같습니다:

<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의 pom.xml 파일 코드는 다음과 같습니다:

<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의 pom.xml 파일 코드는 다음과 같습니다:

<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의 pom.xml 파일 코드는 다음과 같습니다:

<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 프로젝트의 의존성은 Root 프로젝트에서 나열되었습니다(Root의 패키지 유형을 참조하세요, 그것은 POM입니다).

  • App에서는 필요하지 않습니다-UI-W에서 Lib를 선언합니다1, lib2, Lib3 그 의존성입니다. Maven은 전달 가능한 의존성 기계를 사용하여 이 구체를 구현합니다.