Maven Wrapper 소개와 사용

Apache Maven은 자바 프로젝트에서는 없어서는 안 될 의존성 관리 도구입니다. 이를 좀 더 쉽게 최신 버전을 유지하기 위해 Maven Wrapper가 나왔는데, Maven Wrapper가 설정된 프로젝트는 Maven 설치 없이도 빌드를 할 수 있다. 본 글에서는 이 Maven Wrapper에 대해서 알아보도록 하겠습니다.

소개

Maven Wrapper(이하 'mvnw')는 Apache Maven을 프로젝트에서 요구하는 버전으로 유지하기 위해 사용하는 유용한 도구이다. 만약 여러분의 로컬 시스템에 mvn이 설치되어 있지 않거나 혹은, mvn 버전이 2.x대의 낮은 버전이라면 maven을 설치하는 것도 프로젝트를 설정하는데 번거로운 작업일 것이다. 그렇다, Gradle을 아는 독자라면 Gradle Wrapper와 같은 개념의 도구이다.

실행하기

일반적으로 Maven은 다음과 같은 명령으로 실행한다.

1
mvn clean package

하지만, mvnw가 설정된 프로젝트의 경우 다음과 같은 명령어로 실행한다. 만약 mvnw에 실행 권한이 없다면 실행 권한을 추가해야 한다(chmod +x mvnw).

1
./mvnw clean package

또는 윈도우에서는 다음과 같은 명령어로 실행한다.

1
mvnw.cmd clean install

사용되는 maven의 버전은 .mvn/wrapper/maven-wrapper.properties 파일에 distributionUrl 속성에 정의된다. 또한 프로젝트 최상단 디렉토리에 mvnw, mvnw.cmd와 .mvn 디렉토리가 있다면, mvnw가 설정되어 있는 프로젝트이다.

프로젝트에 mvnw 초기 구성

그렇다면, mvnw가 구성되지 않은 프로젝트의 경우에는 어떻게 구성해야 할까? 우선 mvn 명령어가 동작하게 maven 환경을 구성해야 한다. maven 구성 방법은 구글에 검색하면 바로 나온다. 필자의 경우에는 Apache Maven 사이트에서 직접 내려받아 설치 방법대로 간단히 설치한다.

maven 환경이 설정되었다면, 다음의 명령어를 실행할 수 있을 것이다. 만약 -Dmaven 버전을 명시하지 않으면, 실행 시점에 maven 최신 버전이 mvnw 설정되며, 이후 maven이 설치되어 있지 않은 개발자는 mvnw만으로도 maven이 설치되면서 빌드를 할 수 있다. 이렇게 실행하면 위에 설명한 mvnw, mvnw.cmd와 .mvn 디렉토리가 생성되는 것을 확인할 수 있다.

1
mvn -N io.takari:maven:wrapper -Dmaven=3.3.3

mvnw로 설치된 maven 배포판은 어디에 설치되어 있을가?  (사용자홈)/.m2/wrapper/dists 디렉토리에 설치된다.

1
2
combine@localhost:~$ ls ~/.m2/wrapper/dists/
apache-maven-3.3.9-bin

추가 설정

mvn 명령어로 프로젝트를 빌드 했을 때, jvm의 힙메모리가 부족해 MAVEN_OPTS 옵션에 Xmx 옵션 추가한 적이 있는가? mvnw를 사용한다면 .mvn/jvm.config에 다음과 같이 쉽게 메모리 옵션을 줄 수 있다.

1
2
combine@localhost:~/git/project_name/.mvn$ cat jvm.config 
-Xmx4096m 

maven의 빌드 속도를 높이고 싶은가? takari-smart-builder를 사용해서 좀 더 빠르게 프로젝트를 구성할 수 있다. 아래 첨부된 extensions.xml 파일과 maven.config 파일을 .mvn 디렉토리 내에서 생성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<extensions>
    <extension>
        <groupId>io.takari.maven</groupId>
        <artifactId>takari-smart-builder</artifactId>
        <version>0.4.0</version>
    </extension>
    <extension>
        <groupId>io.takari.aether</groupId>
        <artifactId>takari-concurrent-localrepo</artifactId>
        <version>0.0.7</version>
    </extension>
</extensions>
1
--builder smart -T8
1
--builder smart -T2.0C

.mvn 디렉토리에는 이 문서와 같이 작업했을 때, 다음의 파일들이 있을 것이다.

1
2
.mvn$ ls
extensions.xml  jvm.config  maven.config  wrapper

그 밖에 여러 maven option을 maven.config 파일에 넣을 수 있으므로 다양하게 공통된 메이븐 환경을 설정할 수 있을 것이다.

결론

복잡해지는 빌드 환경을 Maven Wrapper를 이용해 해결하는 것을 배울 수 있었다. Maven Wrapper는 Spring, Presto 등의 유명 프로젝트에서도 활발히 사용 중이다. 여러분의 프로젝트에도 Maven Wrapper가 적용되는 데 도움이 되었으면 한다.

긴 글 읽어 주셔서, 감사합니다. 글에 추가 내용 혹은 다른 의견이 있으신 분은 댓글 부탁드립니다.


Popit은 페이스북 댓글만 사용하고 있습니다. 페이스북 로그인 후 글을 보시면 댓글이 나타납니다.