[자바 세상의 빌드를 이끄는 메이븐] 이라는 책을 읽으면서 알게된 내용을 정리하려고 함.
메이븐은 'mvn' 명령을 실행하면 기본적으로 pom.xml 파일을 읽어 빌드를 실행한다.
pom.xml 파일이 아닌 다른 설정 파일을 사용하고자 한다면 '-f' 또는 '--file' 옵션을 사용하면 된다.
ex)
mvn -f mypom.xml test
아키타입
- 메이븐의 템플릿 프로젝트로 프로젝트를 생성하면 프로젝트의 뼈대를 자동으로 생성할 수 있다.
- 메이븐의 이 같은 기능을 아키타입 이라고 한다. 메이븐에서 제공하는 아키타입은 메이븐 중앙저장소에서 관리한다.
- 메이븐 아키타입을 통해 기본 디렉토리 구조를 자동으로 생성한다. (project이름/src/main/java/groupId값 으로 만들어지는 것)
pom.xml
project : pom.xml 파일의 최상위 엘리먼트
groupId : 프로젝트를 생성하는 조직의 고유 아이디
artifactId : 프로젝트를 식별하는 유일한 아이디
version : 프로젝트의 현재 버전. SNAPSHOT은 메이븐의 예약어이며, SNAPSHOT을 사용하면 라이브러리를 다른 방식으로 관리한다.
groupId + artifactId의 값이 유일한 값이 되어야 한다.
메이븐 라이프사이클
메이븐은 빌드 라이프사이클을 가지며, 라이프사이클의 각 단계를 '페이즈'라고 부른다.
메이븐의 라이프사이클은 순서가 정해져있으며, 순차적으로 페이즈를 실행한다.
일반적인 프로젝트 빌드 과정 :
빌드 결과물 삭제, 컴파일에 필요한 자원을 복사, 소스코드 컴파일, 테스트, 압축(패키지), 배포
메이븐의 라이프사이클 3가지
메이븐 빌드의 중심이 되는 라이프 사이클은 기본 라이프사이클이다.
세 가지 라이프사이클은 독립적으로 실행 가능하다.
1. 기본 라이프사이클 : 소스코드 컴파일, 테스트, 압축, 배포 담당(compile, test, package, install, deploy...)
- compile
- test : 단위테스트 진행
- package : pom.xml의 <packaging /> 엘리먼트 값에 따라 압축한다.
- install : 로컬 저장소(개발자PC)에 압축한 파일을 배포.
- deploy : 원격 저장소(외부에 위치한 메이븐 저장소)에 압축한 파일을 배포
2. clean 라이프사이클 : 빌드한 결과물 제거(clean)
메이븐 빌드를 통해 생성된 모든 산출물을 삭제한다.(target디렉토리 삭제)
3. site 라이프사이클 : 프로젝트 문서 사이트를 생성(site, stie-depoly...)
메이븐 설정 파일의 정보를 활용하여 프로젝트에 대한 문서 사이트를 생성할 수 있도록 지원.
메이븐 플러그인
메이븐에서 제공하는 모든 기능은 플러그인을 기반으로 동작한다.
<build>/<plugins>/<plugin> 엘리먼트 아래에 사용하고자 하는 플러그인의 groupId, artifactId,version을 설정하면 된다.
* 가장 최신 버전의 플러그인이 필요한 경우 verision을생략한다.
플러그인에서 실행할 수 있는 각각의 작업을 골(goal) 이라고 정의한다.
(메이븐 플러그인은 하나의 플러그인에서 여러 작업 수행 가능)
artifactId가 'maven-$name-plugin' 과 '$name-maven-plugin' 규칙을 따른다면
$name:goal 형식으로 실행할 수 있다 ex) compiler:compile
실질적으로 빌드 작업은 각 페이즈에 연결되어 있는 플러그인의 골이 한다.
실제로test 페이즈를 실행하면(mvn test) 이에 연결되어 있는 플러그인의 골이 실행된다.
메이븐 기본 페이즈와 플러그인
기본 페이즈에 연결되어 있는 플러그인은 메이븐 중앙 저장소에서 자동으로 다운로드한다. 추가 설정 필요x
1. 자원 복사 및 소스 코드 컴파일(resources, compile)
자바 소스를 컴파일 할때, 컴파일러의 버전, 자바 소스코드의 인코딩 설정이 필요한 경우
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
...
2. 테스트 자원 복사 및 테스트 코드 컴파일(testResources,testCompile)
3. 테스트(test)
만약 단위 테스트를 실행하지 않도록 하고 싶은 경우
mvn -Dmaven.test.skip=true test
매번 코드를 인자로 전달하기 싫다면 pom.xml 에 다음과 같이 추가
<project....>
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
만약 일부 단위 테스트가 실패하더라도 다음 단계의 빌드를 실행하도록 하고 싶은 경우
surefire 플러그인(test 페이즈에 연결되어 있는 플러그인,JUnit 기반으로 동작)을 설정할 수 있다.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<testFailureIgnore>true</testFailureIgnore> // 단위 테스트 실패 무시
</configuration>
</plugin>
4. 패키징(package)
package 페이즈를 실해하면 jar,war 파일이 target 디렉토리 하위에 생성된다.
기본적으로 <build>/<finalName>엘리먼트에 설정된 값이 있으면, ${finalName}.${packaging}형태로 압축파일 생성.
5. 배포하기(install, deploy)
package 페이즈를실행해서 압축된 파일을
install : 로컬 저장소에 배포
deploy : 메이븐 저장소에 배포
6. 빌드 결과물 제거하기(clean)
clean: target 디렉토리 삭제
명시적으로 실행하지 않을 경우 실행되지 않음. 전에 빌드했던 불필요한 산출물이 남아있으면 에러 발생 가능.
mvn clean install 처럼 반드시 clean하고 빌드하는 습관을 가지자.
메이븐 저장소의 종류
중앙저장소
아파치 소프트웨어 재단에서 운영. 오픈 소스 라이브러리, 메이픈 플러그인, 메이픈 아키타입을 관리한다.
메이븐은 이 주소의 서버에 접속해서 라이브러리 등의 프로그램을 다운로드한다.
원격저장소
로컬저장소
'Java' 카테고리의 다른 글
Java Reflection 알아보기 (0) | 2024.05.16 |
---|---|
JVM 메모리 구조 (0) | 2024.05.14 |
정렬할때 쓰기 좋은 메소드 (0) | 2024.02.15 |
문자열과 String 클래스 (0) | 2024.01.05 |
Optional<T> (0) | 2024.01.05 |