Maven Wrapper는 어디에 쓰는 물건인지..

소스코드를 빌드하려고 할 때 보통은 개발자의 노트북이나 PC에 Maven이 설치되어 있어야 합니다. Maven Wrapper는 Maven을 설치하지 않아도 자동으로 Maven을 다운로드하고 빌드를 할 수 있도록 해주는 기능으로써 각 프로젝트에 Maven Wrapper를 추가해두면 Java만 설치되어 있는 Linux 시스템에서도 별도로 Maven을 설치하지 않고 손쉽게 빌드할 수 있습니다. 단, Maven Wrapper는 다음의 경우 쓰기가 어려울 수 있습니다.

  • Maven Wrapper는 Maven을 다운로드하도록 되어 있으므로 인터넷이 안되는 환경에서는 사용이 어렵습니다.
  • Maven Wrapper를 실행시키는 환경에서는 반드시 JDK 또는 JRE가 설치되어 있어야 합니다.

Maven Wrapper란?

Maven Wrapper는 Maven을 별도로 설치하지 않더라도 Maven Wrapper가 Maven을 자동으로 다운로드하여 빌드할 수 있도록 지원합니다.

.
├── .mvn
│   └── wrapper
│       ├── maven-wrapper.jar
│       └── maven-wrapper.properties
├── README.md
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── mvnw
├── mvnw.cmd
├── pom.xml
├── settings.gradle
└── src
    └── main
        └── java
            └── com
                └── example
                    └── authenticatingldap
                        ├── AuthenticatingLdapApplication.java
                        └── HomeController.java

Maven Wrapper의 설정 파일은 .mvn/wrapper/maven-wrapper.properties 파일이며 이 파일은 다음과 같이 구성되어 있습니다.

distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip

이제 mvnw  커맨드를 실행하여 Maven을 실행할 수 있습니다.

# ./mvnw -Dmaven.test.skip=true clean package                                                                                                                        20:24:10 git:(master) ✗ 
Downloading https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Unzipping /Users/fharenheit/.m2/wrapper/dists/apache-maven-3.6.3-bin/lm9vem38rfmjij3jj0mk5bvnt/apache-maven-3.6.3-bin.zip to /Users/fharenheit/.m2/wrapper/dists/apache-maven-3.6.3-bin/lm9vem38rfmjij3jj0mk5bvnt
Set executable permissions for: /Users/fharenheit/.m2/wrapper/dists/apache-maven-3.6.3-bin/lm9vem38rfmjij3jj0mk5bvnt/apache-maven-3.6.3/bin/mvn
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------< com.example:authenticating-ldap >-------------------
[INFO] Building authenticating-ldap 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ authenticating-ldap ---
[INFO] Deleting /Users/fharenheit/Downloads/gs-authenticating-ldap/complete/target
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ authenticating-ldap ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO] Copying 1 resource
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ authenticating-ldap ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 3 source files to /Users/fharenheit/Downloads/gs-authenticating-ldap/complete/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ authenticating-ldap ---
[INFO] Not copying test resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ authenticating-ldap ---
[INFO] Not compiling test sources
[INFO] 
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ authenticating-ldap ---
[INFO] Tests are skipped.
[INFO] 
[INFO] --- maven-jar-plugin:3.1.2:jar (default-jar) @ authenticating-ldap ---
[INFO] Building jar: /Users/fharenheit/Downloads/gs-authenticating-ldap/complete/target/authenticating-ldap-0.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- spring-boot-maven-plugin:2.2.6.RELEASE:repackage (repackage) @ authenticating-ldap ---
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.669 s
[INFO] Finished at: 2020-04-19T20:25:26+09:00
[INFO] ------------------------------------------------------------------------

Maven Wrapper 프로젝트는 첨부파일을 참고하십시오. Maven Wrapper의 경우 distributionUrl의 다운로드 경로가 외부에 있는 경우 인터넷 네트워크에 접속이 되어야 합니다. 만약에 내부에서 사용하고자 하는 경우 내부 웹 서버 등을 통해 업로드후 사용하도록 합니다.

Maven Wrapper 다운로드

 현재 디렉토리에 Maven Wrapper를 추가하려면 다음의 커맨드를 실행해야 합니다. 단, 이 커맨드도 마찬가지로 인터넷 연결이 되어 있어야 합니다.

# mvn -N io.takari:maven:wrapper

생성된 결과물은 다음과 같이 확인할 수 있습니다.

# tree -a                                                                                                                                                              .
├── .mvn
│   └── wrapper
│       ├── MavenWrapperDownloader.java
│       ├── maven-wrapper.jar
│       └── maven-wrapper.properties
├── mvnw
└── mvnw.cmd

2 directories, 5 files

만약에 사용할 Maven의 버전을 명시하고자 하는 경우는 다음과 같이 지정할 수 있습니다.

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

Maven Wrapper를 실행하면 사용자의 홈 디렉토리에 다음의 위치에 다운로드를 하고 사용합니다.

# cd ~/.m2/wrapper/dists
# tree                                                                                                                                                                                                      .
└── apache-maven-3.6.3-bin
    └── lm9vem38rfmjij3jj0mk5bvnt
        ├── apache-maven-3.6.3
        │   ├── LICENSE
        │   ├── NOTICE
        │   ├── README.txt
        │   ├── bin
        │   │   ├── m2.conf
        │   │   ├── mvn
        │   │   ├── mvn.cmd
        │   │   ├── mvnDebug
        │   │   ├── mvnDebug.cmd
        │   │   └── mvnyjp
        │   ├── boot
        │   │   ├── plexus-classworlds-2.6.0.jar
        │   │   └── plexus-classworlds.license
        │   ├── conf
        │   │   ├── logging
        │   │   │   └── simplelogger.properties
        │   │   ├── settings.xml
        │   │   └── toolchains.xml
        │   └── lib
        │       ├── cdi-api-1.0.jar
        │       ├── cdi-api.license
        │       ├── commons-cli-1.4.jar
        │       ├── commons-cli.license
        │       ├── commons-io-2.5.jar
        │       ├── commons-io.license
        │       ├── commons-lang3-3.8.1.jar
        │       ├── commons-lang3.license
        │       ├── ext
        │       │   └── README.txt
        │       ├── guava-25.1-android.jar
        │       ├── guava.license
        │       ├── guice-4.2.1-no_aop.jar
        │       ├── guice.license
        │       ├── jansi-1.17.1.jar
        │       ├── jansi-native
        │       │   ├── README.txt
        │       │   ├── freebsd32
        │       │   │   └── libjansi.so
        │       │   ├── freebsd64
        │       │   │   └── libjansi.so
        │       │   ├── linux32
        │       │   │   └── libjansi.so
        │       │   ├── linux64
        │       │   │   └── libjansi.so
        │       │   ├── osx
        │       │   │   └── libjansi.jnilib
        │       │   ├── windows32
        │       │   │   └── jansi.dll
        │       │   └── windows64
        │       │       └── jansi.dll
        │       ├── jansi.license
        │       ├── javax.inject-1.jar
        │       ├── javax.inject.license
        │       ├── jcl-over-slf4j-1.7.29.jar
        │       ├── jcl-over-slf4j.license
        │       ├── jsoup-1.12.1.jar
        │       ├── jsoup.license
        │       ├── jsr250-api-1.0.jar
        │       ├── jsr250-api.license
        │       ├── maven-artifact-3.6.3.jar
        │       ├── maven-builder-support-3.6.3.jar
        │       ├── maven-compat-3.6.3.jar
        │       ├── maven-core-3.6.3.jar
        │       ├── maven-embedder-3.6.3.jar
        │       ├── maven-model-3.6.3.jar
        │       ├── maven-model-builder-3.6.3.jar
        │       ├── maven-plugin-api-3.6.3.jar
        │       ├── maven-repository-metadata-3.6.3.jar
        │       ├── maven-resolver-api-1.4.1.jar
        │       ├── maven-resolver-connector-basic-1.4.1.jar
        │       ├── maven-resolver-impl-1.4.1.jar
        │       ├── maven-resolver-provider-3.6.3.jar
        │       ├── maven-resolver-spi-1.4.1.jar
        │       ├── maven-resolver-transport-wagon-1.4.1.jar
        │       ├── maven-resolver-util-1.4.1.jar
        │       ├── maven-settings-3.6.3.jar
        │       ├── maven-settings-builder-3.6.3.jar
        │       ├── maven-shared-utils-3.2.1.jar
        │       ├── maven-slf4j-provider-3.6.3.jar
        │       ├── org.eclipse.sisu.inject-0.3.4.jar
        │       ├── org.eclipse.sisu.inject.license
        │       ├── org.eclipse.sisu.plexus-0.3.4.jar
        │       ├── org.eclipse.sisu.plexus.license
        │       ├── plexus-cipher-1.7.jar
        │       ├── plexus-cipher.license
        │       ├── plexus-component-annotations-2.1.0.jar
        │       ├── plexus-component-annotations.license
        │       ├── plexus-interpolation-1.25.jar
        │       ├── plexus-interpolation.license
        │       ├── plexus-sec-dispatcher-1.4.jar
        │       ├── plexus-sec-dispatcher.license
        │       ├── plexus-utils-3.2.1.jar
        │       ├── plexus-utils.license
        │       ├── slf4j-api-1.7.29.jar
        │       ├── slf4j-api.license
        │       ├── wagon-file-3.3.4.jar
        │       ├── wagon-http-3.3.4-shaded.jar
        │       └── wagon-provider-api-3.3.4.jar
        └── apache-maven-3.6.3-bin.zip

17 directories, 85 files