English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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은 전달 가능한 의존성 기계를 사용하여 이 구체를 구현합니다.