툴 [Tool]

[Maven] 메이븐 의존설정 제외하기. exclusions 태그 용도 및 기능.

도로락 2019. 5. 28. 00:30
참고글



메이븐 의존설정 제외하기. exclusions 태그 용도 및 기능
메이븐의 가장 큰 장점으로 라이브러리 의존 해결 기능입니다. 예를 들어 spring-context 라이브러리가 필요하다면 pom.xml에 다음과 같이 <dependency> 를 정의해주기만 하면 됩니다. 
     <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>4.1.0.RELEASE</version>
     </dependency>
cs

그런데 여기서 중요한 점은 spring-context를 개발할때 사용한 라이브러리가 있다는 것입니다. 예를 들어 logging 관련 프레임워크인 commons-logging이 그 예인데, 이 경우 메이븐이 spring-context의 <dependency>를 참고하여 자동으로 commons-logging까지 내려받게 됩니다.




<exclusions> 용도 및 사용법
<exclusions>는 뜻 그대로 특정 의존 라이브러리를 제외시키는 기능을 합니다.

앞선 예를 기준으로 설명해보자면 spring-context-4.1.0.jar이 commons-logging-1.0.0.jar를 의존한다고 했을때 spring-context-4.1.0을 dependency 설정으로 등록했을때 자동으로 commons-logging-1.0.0.jar를 내려받아 빌드환경에 추가됩니다.

이때 여기서 두가지 문제가 있을 수 있습니다.
첫번째로 spring-context-4.1.0.jar을 사용하지만 commons-logging은 2.0.0을 사용하고 싶은 경우입니다.
두번째로 spring-context를 사용하지만 로깅 프레임웍을 commons-logging(log4j)가 아닌 logback(slf4j)을 사용하고 싶은 경우입니다.

이경우 명시적으로 <exclusions>를 통해  commons-logging-1.0.0이 추가되지 않도록 할 수 있습니다. <exclusions>는 다음과 같은 형식으로 사용합니다.
     <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>4.1.0.RELEASE</version>
           <exclusions>
                <exclusion>
                     <groupId>commons-logging</groupId>
                     <artifactId>commons-logging</artifactId>
                </exclusion>
           </exclusions>
     </dependency>
cs


그러나 이대로 테스트를 수행하거나 빌드를 하는경우 당연히 실패할것입니다. 의존하는 logging 라이브러리가 없기 때문이지요. 따라서 exclusions를 사용한 경우 그 빈자리를 채워줄 dependency를 추가로 정의해주어야 합니다.




의존 라이브러리 모두 제외시키기
추가적으로 a.jar를 의존설정에 추가하지만 a.jar가 참조하는 모든 라이브러리를 자동으로 내려받지 않도록 하기 위해서는 아래와 같이 사용할 수 있습니다. 예를 들어 spring-context가 commons-logging 이외에도 여러가지 라이브러리를 의존하고 있을 수 있는데 그 모든것을 명시적으로 제외시켜주는것입니다. 
     <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>4.1.0.RELEASE</version>
           <exclusions>
                <exclusion>
                     <groupId>*</groupId>
                     <artifactId>*</artifactId>
                </exclusion>
           </exclusions>
     </dependency>
cs


단 spring-context가 참조하는 모든 라이브러리를 직접 dependency로 추가해주거나 클래스패스를 설정하고 해당 패스에 직접 라이브러리를 등록해주어야 합니다.