자바프로젝트의 의존성 관리와 빌드 자동화 기능을 제공하는 툴이며, 프로젝트 내에서 pom.xml
을 주설정파일로 하여 동작한다.
의존성 관리
개발시 사용하는 라이브러리에 대해 pom.xml
을 기준으로 메이븐 저장소로부터 다운받아 개발자의 프로젝트에 추가해 준다. (로컬저장소의 .m2 폴더에 다운로드 되며 가끔 의존성이 꼬일경우 .m2 폴더 내용을 날려주면 해결되는 경우가 있었다.)
라이브러리 추가를 위해서는 <dependencies/>
이하에 <dependency/>
태그에 작성하며 groupId, artifactId, version 세가지 정보가 필요하다. 보통 필요한 라이브러리가 있는 경우 maven repository 웹사이트에서 검색하여 등록한다.
<project>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
<scope>
: compile, runtime, provided, test 등이 올 수 있는데 해당 라이브러리가 언제 필요한지, 언제 제외되는지를 나타낸다.<exclusions>
: 의존하는 라이브러리 중에서 제외할 라이브러리를 명시한다.<version>
: 가져올 라이브러리의 버전을 명시하지만 위와같이 생략할 경우 최신버전을 가져온다. 하지만 위는 스프링 부트 프로젝트이므로 부모POM에 명시된 버전을 가져온다.
빌드 자동화
메이븐은 자바 프로젝트의 빌드(Build)를 자동화해 주는 빌드 툴(Build Tool)이다. 즉, 자바 소스를 컴파일하고 패키징하여 배포까지 자동으로 해주는 도구이다.
컴파일->패키징->배포 과정(maven build)에 대한 세부 설정값들은 pom.xml
에 작성한다.
빌드과정은 여러가지 세부 작업들로 나눠져 있고 이 세부 작업을 메이븐에서는 goal
이라고 한다. 그리고 goal
들을 엮어서 이를 plugin
이라 한다.
메이븐이 빌드과정에서 수행하는 작업은 미리 정해진 순서의 plugin
의 goal
들을 수행하는 것이라고 이해하자.
- Goal : 빌드과정의 세부작업
- Plugin : Goal의 묶음
스프링 부트 프로젝트를 생성한 후 Maven 탭을 보면 아래와 같이 plugin
이 설정되어있다. clean
의 경우 clean plugin 안에 clean
, help
goal이 포함되어 있으며 clean:help
처럼 플러그인:골 형태로 Goal을 표현한다. spring-boot 플러그인을 제외한 나머지는 기본으로 내장된 플러그인이다.
maven build는 LifeCycle이 존재하며, 메이븐에 내장된 라이프사이클은 default, clean, site 3가지가 있다.
라이프사이클은 세부적으로 페이즈(phase)로 구성되어 있다. 예를 들어 default 라이프사이클은 다음과 같이 7개의 페이즈로 구성되며(전부는 아니고 큰 줄기로하면) 이들 사이에는 실행순서가 존재한다.
mvn install 명령어로 install 페이즈를 실행하면 1번 validate 페이즈부터 6번 install 페이즈까지 순차적으로 실행되는 구조다. (deploy는 실행되지 않는다.)
- validate
- compile
- test
- package
- verify
- install
- deploy
메이븐 명령 실행
mvn 명령은 스페이스를 구분자로 여러동작을 한번에 지정할 수 있다.
mvn clean deploy
: clean 페이즈 실행 후 1번 페이즈 validate부터 7번 페이즈 deploy까지 실행한다.
phase
는 구체적인 작업을 지정하지 않는 상위 개념으로 결국 수행하는 작업은 goal
이며 phase마다 수행할 작업 goal
들이 맵핑되어 있다.
goal
은 하나 이상의 phase
에 맵핑되어 있거나, 맵핑이 되어 있지 않은 것도 있는데 맵핑된 phase
가 없다면 직접 호출(플러그인명:골명)하여 실행할 수 있다.
mvn clean dependency:copy-dependencies package
clean
: clean phase 실행(라이프사이클 순서에 따라 순차적으로)dependency:copy-dependencies
: dependency plugin의 copy-dependencies goal 실행package
: package phase 실행(라이프사이클 순서에 따라 순차적으로)
메이븐의 빌드자동화를 정리하면,
- LifeCycle : 순서를 가지는 Phase의 집합
- Phase : LifeCycle의 구성요소로 Phase간에는 정해진 순서가 있다.
- Goal : 메이븐이 수행할 구체적인 작업으로 하나의 페이즈는 하나의 골과 맵핑된다.
- Plugin : Goal의 집합