maven / / 2023. 11. 21. 07:30

maven dependency에서 optional의 의미

일반적으로 maven 프로젝트를 구성하여 사용할 때 의존하는 프로젝트의 dependency는 사용하는 프로젝트에서 모두 자동으로 가져와서 사용하게 된다.

maven 프로젝트가 아래와 같은 구성으로 되어 있다고 하자.

프로젝트 구성
  • maven-parent (pom)

    • maven-child-A (jar)
    • maven-child-B (jar)

maven-child-A에서 maven-child-B를 사용한다고 하자. (maven-child-A --> maven-child-B)

maven-child-A의 pom.xml
<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>maven-child-B</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

이때 maven-child-B에 junit 의존성을 추가해보자.

<artifactId>maven-child-B</artifactId>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
    </dependency>
</dependencies>

그러면 maven-child-A에서도 junit이 자동으로 의존이 걸리게 된다.

만일 특정 프로젝트에서만 사용하고 싶은 경우에도 해당 프로젝트를 의존하는 모든 프로젝트에 자동으로 의존성이 전이 되므로 프로젝트 파일이 불필요하게 커지는 문제가 생길 수가 있다.

그래서 Maven에서는 <optional> 태그를 통해 명시적으로 해당 프로젝트에서만 사용할 수 있는 옵션을 제공한다.

<optional> 사용방법

<optional>은 maven dependency의 optional 요소에 true 값으로 설정만 하면 적용이 된다.

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <optional>true</optional>
</dependency>

optional을 true로 설정하면 해당 프로젝트를 의존하는 다른 프로젝트에서는 junit 의존성을 가져가지 않고 이 프로젝트에서만 사용한다는 것을 의미한다.

위의 예는 maven-child-B에 적용된 pom.xml 파일 내용이다.

maven-child-A에서는 junit이 빠짐

그럼 pom으로 지정된 프로젝트에 optional을 지정하면 어떻게 될까?

위에서 maven-parent 프로젝트는 pom으로 지정되어 있다.

여기에 jackson 의존성을 추가해보자.

maven-parent의 pom.xml
<artifactId>maven-parent</artifactId>
<packaging>pom</packaging>
<modules>
    <module>maven-child-A</module>
    <module>maven-child-B</module>
</modules>

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

하위의 maven-child-A와 maven-child-B에서 jackson 의존성이 전이될까?

결론은 pom으로 지정된 프로젝트에서는 <optional>이 먹지 않는다. 당연한 결과이지만 pom은 하위 프로젝트 구성을 위한 모델을 정의하므로 pom에서는 optional이 적용되지 않는다.

그래서 하위 프로젝트 모두 의존성이 전이된다. (jackson 의존성 전이)

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