Maven Dependencies
Library 들을 project files인 pom.xml 내의 선언하게 된다.
Maven에서는 이 Library 들을 Dependencies에 선언하고,
이를 일반적으로 Library가 아닌 Dependencies(Dependency)라고 부른다.
프로젝트에 사용되는 모든 dependencies는 그 자체가 선언되거나 parents에 의해 dependencies로 선언되어 있다..
<project>
...
<dependencies>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-a</artifactId>
<version>1.0</version>
<exclusions>
<exclusion>
<groupId>group-c</groupId>
<artifactId>excluded-artifact</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-b</artifactId>
<version>1.0</version>
<type>bar</type>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
Transitive Dependencies (전이적 종속성)
Dependencies 내의 libraries를 사용자가 발견하거나 특정하여 지정할 필요가 없도록 만든다.
A
├─ B
│ └─ C
│ └─ D
└─ E
└─ D
예를 들어, 위와 같은 구조에서
사용자는 B/E만을 Dependencies로 추가했지만 Maven은 B,C,D,E를 자동으로 Dependencies로 인식한다.
Dependency mediation (의존성 중재)
Project 내의 하나의 Dependency가 여러 개의 Version이 선언되어 있는 경우
Maven은 nearest definition에 의해 종속성의 버전을 결정한다.
- 가장 가까운 곳에 선언된 Dependencies를 따른다.
- 가장 위에 선언된 Dependencies를 따른다.
A(0)
├─ B(1)
│ └─ C(2)
│ └─ D(3) 2.0
└─ E(1)
└─ D(2) 1.0
* () 안 숫자는 거리
예를 들어 D Dependency에 대해 위처럼 선언되어 있다고 하면
C와 E 중 Project로부터 가장 가까운 D(3)를 따라 Version 1.0이 사용된다.
A
├── B
│ └── C
│ └── D 1.0
├── E
│ └── F
│ └── D 2.0
이 경우에는 같은 거리를 가지지만 가장 위에 선언된 D인 Version 1.0이 사용된다.
jar-with-dependencies
Maven 빌드 시 jar-with-dependencies라는 descriptor를 사용하여 모두 jar 파일에 포함하여 배포하는 경우가 있다.
이를 Project에 dependency로 추가할 경우 내부의 dependencies 모두 같은 거리를 가지게 된다.
의존성이 아닌 Class로 자체로 가지고 있기 때문으로 보인다.
A(0)
├── B(1)
│ └── C(2) 2.0
├── D(1)
│ └── E(1)
│ └── C(1) 1.0
예를 들면 D가 jar-with-dependencies라고 생각해보자.
거리 상으로는 2.0이 가 더 가깝지만 jar-with-dependencies에 의해 1.0 버전이 사용된다.
이 때, C 2.0 버전을 사용하기 위해서는 어떻게해야할까?
C를 명시적으로 프로젝트에 선언해주면 된다.
A(0)
├── B(1)
│ └── C(2) 2.0
├── C(1) 2.0
├── D(1)
│ └── E(1)
│ └── C(1) 1.0
C가 nearest definition에 의해 2.0 버전이 사용된다.
A(0)
├── B(1)
│ └── C(2) 2.0
├── D(1)
│ └── E(1)
│ └── C(1) 1.0
├── C(1) 2.0
단, 주의할 점은 위와 같이 C가 jar-with-dependencies인 D보다 아래에 선언된 경우,
더 위에 선언되고 거리가 같은 C 1.0 버전이 사용되므로 jar-with-dependencies가 하단에 위치해야 한다.
참고 문헌
https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
https://maven.apache.org/plugins/maven-assembly-plugin/usage.html
'기타 주제' 카테고리의 다른 글
Java의 Slf4j, Logging Framework와 Dependency (1) | 2024.09.02 |
---|---|
piix4smbus: Host SMbus controller not enabled (0) | 2022.10.05 |
Github actions 관련 정보 (0) | 2022.09.15 |
Lex 와 Yacc (0) | 2021.04.12 |