Skip to content

Apache Maven

Maven is distributed in several formats for your convenience. Use a source archive if you intend to build Maven yourself. Otherwise, simply pick a ready-made binary distribution and follow the installation instructions given at the end of this document. You will be prompted for a mirror - if the file is not found on yours, please be patient, as it may take 24 hours to reach all mirrors.
Maven은 지금까지 애플리케이션을 개발하기 위한 반복적으로 진행해 왔던 작업들을 지원하기 위하기 등장한 툴이다. Maven이 지원하는 작업은 다음과 같다.

  • Builds
  • Documentation
  • Reporting
  • Dependencies
  • SCMs
  • Releases
  • Distribution

Ant 를 이용하여 지금까지 위 작업 중의 일부(Builds, Reporting 등) 작업을 진행해 왔지만 일관된 가이드안이 없는 상태였기 때문에 프로젝트를 진행할 때마다 대부분의 작업을 반복해야 했다. 그러나 Maven의 경우에는 프로젝트 관리를 위하여 필요한 모든 작업을 추상화하여 툴이 지원하도록 구현했다. Ant를 사용하다 Maven을 처음 시작하는 개발자들은 Maven의 제약사항에 거부감을 느낄 수 있다. Ant만큼 자유도가 높지는 않지만(물론 Ant의 빌드 스크립트와 통합하는 것도 가능하다.) Ant를 사용하면서 반복해야 했던 많은 작업들을 줄여준다. 이 같은 효과는 모든 프로젝트를 일관된 구조로 관리, 배포, 운영하는 것이 가능하기 때문에 프로젝트의 복잡도가 증가하고 있는 최근에는 적합한 툴이라 생각한다.

Categories

Maven 프로젝트 생성하기

설치가 끝났다면 Maven 프로젝트를 생성해 보자. 명령 프롬프트에서 아래 명령어를 실행하면 된다. (아래 명령어를 처음 실행할 경우 꽤 오랜 시간이 걸리는데, 그 이유는 Maven이 필요한 플러그인과 모듈을 다운로드 받기 때문이다. Maven 배포판은 최초로 Maven을 사용하는 데 필요한 모듈만 포함하고 있고, 그 외에 archetype 플러그인, compiler 플러그인 등 Maven을 사용하는 데 필요한 모듈은 포함하고 있지 않다. 이들 모듈은 실제로 필요할 때 Maven 중앙 리포지토리에서 로딩된다.)

mvn archetype:generate
  • groupId: 프로젝트 속하는 그룹 식별 값. 회사, 본부, 또는 단체를 의미하는 값이 오며, 패키지 형식으로 계층을 표현한다.
  • artifactId: 프로젝트 결과물의 식별 값. 프로젝트나 모듈을 의미하는 값이 온다.
  • version: 결과물의 버전을 입력한다.
  • package: 기본적으로 생성할 패키지를 입력한다. 별도로 입력하지 않을 경우 groupId와 동일한 구조의 패키지를 생성한다.

기존에는 archetype:create 골을 이용해서 프로젝트를 생성했었다. 하지만, maven-archetype-plugin의 버전이 올라가면서 archetype:generate 골이 추가되었고, archetype:create 골은 deprecated 되었다. 하지만, 하위 호환을 위해 archetype:create 골은 아직 지원되고 있다.

컴파일/테스트/패키징

소스 코드를 컴파일 하려면 다음과 같은 명령어를 실행해주면 된다.

mvn compile

컴파일 된 결과는 target/classes 디렉터리에 생성된다.

Maven 프로젝트의 기본 디렉토리 구조

Maven을 이야기 할 때 나오는 글이 있다. "Convention Over Configuration" 이다. "관습이 설정보다 우선한다" 라는 말이다. 개발자가 모든 것을 설정하는 것보다 기본적으로 정해진 규칙에 따라서 그냥 사용하자.

Maven_project_basic_structure.jpeg

archetype:generate 골이 성공적으로 실행되면, artifactId에 입력한 값과 동일한 이름의 디렉터리가 생성된다. 위 경우에는 현재 디렉터리에 simple-app 이라는 하위 디렉터리가 생성된다. 위 과정에서 선택한 archetype은 maven-archetype-quickstart 인데, 이 archetype을 선택했을 때 생성되는 디렉터리 구조는 다음과 같다.

simple-app
├─src
│   ├─main
│   │  └─java
│   ├─test
│       └─java
└─pom.xml
  • src/main/java - 자바 소스 파일이 위치한다.
  • src/main/resources - 프로퍼티나 XML 등 리소스 파일이 위치한다. 클래스패스에 포함된다.
  • src/main/webapp - 웹 어플리케이션 관련 파일이 위치한다. (WEB-INF 디렉터리, JSP 파일 등)
  • src/test/java - 테스트 자바 소스 파일이 위치한다.
  • src/test/resources - 테스트 과정에서 사용되는 리소스 파일이 위치한다. 테스트 시에 사용되는 클래스패스에 포함된다.

컴파일 해보기/테스트 실행 해보기/패키지 해보기

소스 코드를 컴파일 하려면 다음과 같은 명령어를 실행해주면 된다.

## 컴파일
$ mvn compile

## 패키징
$ mvn package

## 테스트
$ mvn test

컴파일 된 결과는 target/classes 디렉터리에 생성된다.

Maven Lifecycle

메이븐은 미리 정의하고 있는 빌드 순서를 라이프사이클 이라고 하며, 라이프사이클의 각 빌드 단계를 페이지라고 한다. 라이프사이클은 여러 단계(페이즈)로 나뉘어져 있으며, 각 페이즈는 의존 관계를 갖는다.

  • 기본 라이프 사이클
    • compile : 소스 코드를 컴파일한다
    • test : 단위 테스트 실행 (기본설정은 단위 테스트가 실패하면 빌드 실패로 간주함)
    • package : 컴파일된 클래스 파일과 리소스 파일들을 war 혹은 jar와 같은 파일로 패키징
    • install : 패키징한 파일을 로컬 저장소에 배포 (USER_HOEM/.m2/)
    • deploy : 패키징한 파일을 원격 저장소에 배포 (nexus 혹은 maven central 저장소)
  • clean 라이프 사이클
    • clean : 메이븐 빌드를 통하여 생성된 모든 산출물을 삭제한다.
  • site 라이프 사이클
    • site : 메이븐 설정파일 정보를 활용하여 프로젝트에 대한 문서 사이트를 생성한다.
    • site-deploy : 생성한 문서 사이트를 설정되어 있는 서버에 배포

Maven Version Numbers

The version number of the artifact defined in the POM file is the same as the version number of the released product, for example 12.1.2.0.0, expressed using five digits, as described in the following:

In x.x.x-y-z:

  • x.x.x is the release version number, for example 12.1.2.
  • y is the PatchSet number, for example 0,1,2,3,… with no leading zeros.
  • z is the Bundle Patch number, for example 0,1,2,3,… with no leading zeros.
  • The periods and hyphens are literals.

기존 프로젝트에 Maven 도입하기

프로젝트 우클릭 > Configure > Convert to Maven Project.

이것을 선택하면 위와 같이 POM.xml 파일을 만드는 과정이 나오는데요. Group Id는 프로젝트의 그룹의 식별자를 나타냅니다. 쉽게 생각해서 프로젝트의 패키지명을 생각하시면 될 것 같습니다. Artifact Id는 이 프로젝트를 나타내는 이름을 쓰시면 됩니다. 기존의 거의 대부분의 Maven Repository에 등록된 라이브러리들은 Group Id와 Artifact Id를 소문자와 대시(-) 구성하더군요. 편하신대로 하시면 됩니다.

Maven을 사용할 경우 얻게 되는 잇점은?

Maven을 사용하면서 얻게 되는 잇점은 Benefits of using Maven 문서를 통하여 확인할 수 있다. 필자 또한 Maven 사용할 경우 너무 많은 잇점을 얻을 수 있을거 같아 모두 정리하기 힘들거 같다. 그래도 정리한다면 다음 항목을 최우선적으로 이야기하고 싶다.

  • 편리한 Dependent Library 관리 기능 - Dependency Management
  • 모든 프로젝트의 빌드 프로세스를 일관되게 가져갈 수 있다는 것
  • Maven이 제공하는 많은 플러그인의 활용이 가능하다는 것. 특히 Maven 프로젝트를 Eclipse 기반 프로젝트로 쉽게 변환이 가능한 기능
  • 신규 프로젝트 세팅을 정말 쉽고 빠르게 진행할 수 있다. Maven의 archetype 기능은 정말 만족할 만하다.

로컬의 특정 JAR 파일을 종속성에 추가

pom.xml#로컬의 특정 JAR 파일을 종속성에 추가 항목 참조.

Apache Ant vs Apache Maven vs Gradle

특징

Apache Ant

Apache Maven

Gradle

유형

태스크 기반 빌드 도구

선언적 빌드 및 프로젝트 관리 도구

선언적 빌드 도구 및 설정 언어 지원

설정 언어

XML

XML (POM 파일)

Groovy 또는 Kotlin (DSL)

빌드 스크립트

태스크 기반으로 작성

POM 파일에 의한 선언적 방식

플러그인으로 확장 가능한 유연한 스크립트 기반

종속성 관리

별도의 플러그인 필요

내장된 종속성 관리 시스템

내장된 종속성 관리 시스템

성능

고정된 절차로 작업 처리

고정된 절차로 작업 처리

작업의 증분 빌드와 병렬 실행을 통해 높은 성능

학습 곡선

비교적 쉬움

중간 정도

다소 복잡하지만 유연성 제공

확장성 및 유연성

플러그인 사용 가능하나 제한적

비교적 제한적

강력한 확장성 및 유연성 제공

커뮤니티 및 지원

널리 사용되지만 감소 중

대중적이며 널리 지원

빠르게 성장 중이며 많은 지원

선택 적합성

단순 빌드, 간단한 프로젝트

표준화된 구조의 Java 프로젝트

대규모, 복잡한 프로젝트 및 멀티 언어 빌드

  • Apache Ant는 단순하고, 커스터마이징이 필요한 프로젝트에 적합합니다.
  • Apache Maven은 구조화된 Java 프로젝트에 유용하며, 표준화된 방식으로 종속성 관리와 프로젝트 빌드를 돕습니다.
  • Gradle은 현대적이고 유연성이 뛰어나며, 대규모 프로젝트에서 고성능을 요구하는 경우 적합합니다.

Troubleshooting

An error occured while filtering resources

이클립스에서 아래와 같은 에러 메시지가 출력되었다면 Alt + F5또는 Maven > Update Project ...를 선택하면 된다.

An error occured while filtering resources

Encoding error

아래와 같이 Encoding과 관련된 에러가 발생될 수 있다.

[WARNING] File encoding has not been set, using platform encoding MS949, i.e. build is platform dependent!

이 경우 아래와 같이 설정한다.

<properties>
    <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>utf-8</project.reporting.outputEncoding>
</properties>

See also

Favorite site

POM

Maven eclipse plugin (m2e)

Guide

References


  1. Eclipse_assign_maven_project.pdf 

  2. Create_maven_web_project_use_to_struts.pdf 

  3. Maven_function_intro.pdf 

  4. Egovframework_dev_dep_build_maven.pdf 

  5. Maven_basic_-_how_to.pdf 

  6. 메이븐 version 요소에 SNAPSHOT 문자열을 포함하면, 주기적으로 스냅샷이 최신인지 확인한다.