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 중앙 리포지토리에서 로딩된다.)
- groupId: 프로젝트 속하는 그룹 식별 값. 회사, 본부, 또는 단체를 의미하는 값이 오며, 패키지 형식으로 계층을 표현한다.
- artifactId: 프로젝트 결과물의 식별 값. 프로젝트나 모듈을 의미하는 값이 온다.
- version: 결과물의 버전을 입력한다.
- package: 기본적으로 생성할 패키지를 입력한다. 별도로 입력하지 않을 경우 groupId와 동일한 구조의 패키지를 생성한다.
기존에는 archetype:create 골을 이용해서 프로젝트를 생성했었다. 하지만, maven-archetype-plugin의 버전이 올라가면서 archetype:generate 골이 추가되었고, archetype:create 골은 deprecated 되었다. 하지만, 하위 호환을 위해 archetype:create 골은 아직 지원되고 있다.
컴파일/테스트/패키징
소스 코드를 컴파일 하려면 다음과 같은 명령어를 실행해주면 된다.
컴파일 된 결과는 target/classes 디렉터리에 생성된다.
Maven 프로젝트의 기본 디렉토리 구조
Maven을 이야기 할 때 나오는 글이 있다. "Convention Over Configuration" 이다. "관습이 설정보다 우선한다" 라는 말이다. 개발자가 모든 것을 설정하는 것보다 기본적으로 정해진 규칙에 따라서 그냥 사용하자.
Maven_project_basic_structure.jpeg
archetype:generate
골이 성공적으로 실행되면, artifactId에 입력한 값과 동일한 이름의 디렉터리가 생성된다. 위 경우에는 현재 디렉터리에 simple-app 이라는 하위 디렉터리가 생성된다. 위 과정에서 선택한 archetype은 maven-archetype-quickstart 인데, 이 archetype을 선택했을 때 생성되는 디렉터리 구조는 다음과 같다.
- src/main/java - 자바 소스 파일이 위치한다.
- src/main/resources - 프로퍼티나 XML 등 리소스 파일이 위치한다. 클래스패스에 포함된다.
- src/main/webapp - 웹 어플리케이션 관련 파일이 위치한다. (WEB-INF 디렉터리, JSP 파일 등)
- src/test/java - 테스트 자바 소스 파일이 위치한다.
- src/test/resources - 테스트 과정에서 사용되는 리소스 파일이 위치한다. 테스트 시에 사용되는 클래스패스에 포함된다.
컴파일 해보기/테스트 실행 해보기/패키지 해보기
소스 코드를 컴파일 하려면 다음과 같은 명령어를 실행해주면 된다.
컴파일 된 결과는 target/classes 디렉터리에 생성된다.
Maven Lifecycle
메이븐은 미리 정의하고 있는 빌드 순서를 라이프사이클 이라고 하며, 라이프사이클의 각 빌드 단계를 페이지라고 한다. 라이프사이클은 여러 단계(페이즈)로 나뉘어져 있으며, 각 페이즈는 의존 관계를 갖는다.
- 기본 라이프 사이클
- compile : 소스 코드를 컴파일한다
- test : 단위 테스트 실행 (기본설정은 단위 테스트가 실패하면 빌드 실패로 간주함)
- package : 컴파일된 클래스 파일과 리소스 파일들을 war 혹은 jar와 같은 파일로 패키징
- install : 패키징한 파일을 로컬 저장소에 배포 (USER_HOEM/.m2/)
- deploy : 패키징한 파일을 원격 저장소에 배포 (nexus 혹은 maven central 저장소)
- clean : 메이븐 빌드를 통하여 생성된 모든 산출물을 삭제한다.
- 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 도입하기
이것을 선택하면 위와 같이 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 파일을 종속성에 추가
- IntelliJ IDEA#로컬의 특정 JAR 파일을 종속성에 추가
- Apache Ant -> build.xml#로컬의 특정 JAR 파일을 종속성에 추가
- Gradle -> build.gradle#로컬의 특정 JAR 파일을 종속성에 추가
pom.xml#로컬의 특정 JAR 파일을 종속성에 추가 항목 참조.
Apache Ant vs Apache Maven vs 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 ...
를 선택하면 된다.
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
- Apache Maven web site
- Maven Getting Started Guide
- Maven repository
- [추천] Android Maven으로 안드로이드 개발환경 구축하기.
- [추천] 이클립스에서 메이븐을 이용한 웹프로젝트 생성 (스트럿츠2 사용) 2
- Maven 도구 기능 소개 3
- Maven에 대하여 4
- Wikipedia (en) Apache Maven에 대한 설명
- Maven 활용 팁
- Maven에 대한 정리
- [추천] Maven 기초 사용법 5
- Maven 6장: 메이븐과 이클립스 통합
- Maven pom.xml profile 설정
- Maven 사용자라면 이 정도는 알아야지 (Dependency)
- How do I tell Maven to use the latest version of a dependency?
- Dependency Mediation and Conflict Resolution
- Finding list of versions available in a Maven repository for a specific plugin?
POM
- MvnModule
- POM Syntax
- [추천] Understanding Maven Version Numbers
- 메이븐 (Maven) 버전 (Version) 내 스냅샷 (SNAPSHOT) 6