maven / / 2023. 11. 20. 19:34

Maven Dependency Scope

전이(transitive) 의존성

Maven에는 두 가지 종류의 의존성이 있다.
직접 의존성은 프로젝트에 명시적으로 포함되는 것이다.
<dependency> 태그를 사용하여 포함될 수 있다.

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

반면에, 전이 의존성은 직접 의존성에서 필요로 하는 의존성이다.
Maven은 자동적으로 전이 의존성을 포함한다.

의존성 범위(scope)

의존성 범위는 의존성의 전이를 제한하는데 사용된다. 또한 빌드 작업을 할 때 클래스패스를 수정할 수도 있다. Maven은 6개의 기본 의존성 범위를 가지고 있다.

1. Compile

compile 범위는 설정된 특정 범위가 없다면 기본 범위(scope)가 된다.

이 범위를 가진 의존성은 모든 빌드 작업에서 프로젝트의 클래스패스에서 사용가능하다. 또한 의존하는 프로젝트에 전파된다.

중요한 것은 이 의존성은 전이된다는 것이다.

<dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
</dependency>

2. Provided

우리는 이 범위를 JDK나 컨테이너에서 런타임시 제공되어야 하는 의존성으로 사용할 수 있다.

이 범위를 사용하는 좋은 예는 컨테이너가 이미 특정 라이브러리를 가지고 있는 특정 컨테이너에 배포되는 웹 애플리케이션이다. 예를 들면 런타임 시 서블릿 API를 이미 제공하는 웹서버가 될 수가 있다.

프로젝트에서 provided 범위로 이 의존성을 정의할 수 있다.

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>6.0.0</version>
    <scope>provided</scope>
</dependency>

provided 의존성은 프로젝트의 컴파일 시와 test 클래스 경로에서만 사용이 가능하다. 이 의존성은 전이되지 않는다.

3. Runtime

이 의존성은 런타임시 필요하다. 하지만 프로젝트 코드를 컴파일할 때는 필요하지 않다. runtime 범위로 되어 있는 의존성은 런타임과 test 클래스패스에 존재할 것이기 때문에 컴파일 클래스패스에는 빠질 수 있다.

JDBC 드라이버가 runtime 범위를 사용하는 좋은 예이다.

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
    <scope>runtime</scope>
</dependency>

4. Test

이 범위는 애플리케이션의 기본 runtime에는 필요하지 않고 test 목적으로만 사용된다는 것을 나타낸다.

test 의존성은 전이되지 않고 테스트 용도로만 존재한다.

기본 사용 케이스는 Junit같은 테스트 라이브러리를 추가하는 것이다.

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>

5. System

System 범위는 provided 범위와 비슷하다. 주된 차이점은 system은 특정 jar를 직접 지정한다는 것이다.

기억해야 할 것이 하나 있다. system 범위 의존성을 가진 프로젝트를 빌드하는 것이 다른 위치에서 빌드할 때 빌드가 실패할 수 있다는 것이다.

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>custom-dependency</artifactId>
    <version>1.3.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/libs/custom-dependency-1.3.2.jar</systemPath>
</dependency>

6. Import

pom 타입에에 대해서만 사용가능하다.

import 는 이 의존성이 POM에 선언된 모든 의존성으로 대체된다는 것을 나타낸다.

여기서 아래 custom-project 의존성이 custom-project의 pom.xml에 선언된 모든 의존성이 대체될 것이다.

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>custom-project</artifactId>
    <version>1.3.2</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

Scope와 전이가능성

각 의존성 범위는 자신만의 방법으로 전이 의존성에 영향을 미친다. 이것은 다른 전이 의존성이 결국 다른 범위를 가진 프로젝트에 영향을 미친다는 것을 의미한다.

하지만, provided와 test 범위를 가진 의존성은 메인 프로젝트에 포함되지 않을 것이다.

무슨 의미인지 한번 보자.

  • compile 범위에서, runtime 범위를 가진 모든 의존성은 프로젝트에서 runtime 범위로 되고 compile 범위를 가진 모든 의존성은 프로젝트에서 compile 범위로 가져온다.
  • provided 범위에서, runtime과 compile 범위 의존성은 프로젝트에서 provided 범위로 가져온다.
  • test 범위에서, runtime과 compile 범위의 전이 의존성은 프로젝트에서 test 범위로 가져온다.
  • runtime 범위에서, runtime과 compile 범위의 전이 의존성은 프로젝트에서 runtime 범위로 가져온다.

참고

https://www.baeldung.com/maven-dependency-scopes

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유