Maven
프로젝트의 전체적인 라이프 사이클(프로젝트 생성, 테스트 빌드, 배포 등)을 관리하는 관리 도구.
POM(Project Object Model, 프로젝트 객체 모델)개념을 바탕으로 프로젝트의 의존성 관리, 라이브러리 관리, 프로젝트 라이프사이클 관리 기능등을 제공함.
플러그인 기반으로 소스코드로부터 배포 가능한 산출물을 만들어내는 기능을 제공한다. 즉, 소스코드 및 각종 리소스(xml, 이미지, properties 등)을 JVN 또는 WAS가 인식할 수 있는 구조로 패키징 해줌.
대표기능
빌드 툴
항상 하나의 컴포넌트로 빌드된다.
의존성 관리
빌드 수행 후 리포트 생성
패키징
war, jar, exe 등의 배포 가능한 포멧의 파일 생성
프로젝트 관리
버전과 릴리즈 관리
프로젝트 명시 및 개발 기록
javadoc 쉽게 작성 가능
테스트
배포
해당 프로젝트의 버전 관리를 위해 (운영 서버가 아닌)특정 원격 저장소에 배포
빌드 후 생성된 컴포넌트를 로컬 혹은 원격 저장소에 배포
Maven 프로젝트 생성 흐름
특정 프로젝트 경로 최상위에 pom.xml 생성
<project>
<groupId> { 프로젝트의 그룹명, 유니크한 명칭이어야 함. } </groupId>
<artifactId> { 프로젝트(컴포넌트) 명칭, groupId 단위 내에서 유일해야함. } </artifactId>
<modelVersion> { pom.xml을 이루고 있는 maven.xml 문서 형식의 버전. 무조건 (4.0.0) 이다. } </modelVersion>
<version> { 해당 artifact(컴포넌트)의 version, 뒤쪽 SNAPSHOT은 아직 개발 중임을 의미. } </version>
<packaging> { jar, war, exe 등 어떤 파일 형식으로 패키징 할 것인가를 정의. } </packaging>
</project>
compile 버전 정보 입력
<project>
... 생략 ...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source> { 소스코드 Java 버전(ex 1.8) } </source>
<target> { compile시 결과물 Java 버전(ex 1.8) } </target>
</configuration>
</plugin>
</plugins>
</build>
</project>
코드 작성
빌드
compile 후 target 디렉토리가 생성되며 컴파일된 결과물이 만들어짐.
실행
패키징
Maven 디렉토리 구조
Maven 기본 설정 파일 pom.xml 파일이 프로젝트 root 에 위치.
기본 소스코드 디렉토리 : src/main/java
테스트 코드 디렉토리 : src/test/java
compile 결과 디렉토리 : target
pom.xml 구조
프로젝트 정보
properties : maven 내부에서 반복적으로 사용될 상수 값을 정의할 때 사용 (java version, spring framework version 등)
Dependencies : 최소 groupId, artifactId, version 정보가 필요.
빌드 정보 : plugins, Directory, resources 등의 정보가 필요.
Repository : 의존성을 다운로드 받을 위치의 repository. nexus 등 다수의 repository 기술.
Plugin Repository : maven plugin을 다운로드 받을수 있는 저장소 위치를 기술.
배포 : deploy goal을 실행했을 시 배포되는 위치를 기술.
Goal의 종류
clean : 컴파일 결과물인 target 디렉토리 삭제.
compile : 모든 소스코드 컴파일, 리소스파일을 target/classes 디렉토리에 복사.
package : compile 수행 후, 테스트 수행, <packaging> 정보에 따라 패키징 수행.
install : package 수행 후, local repo에 install 수행.
deploy : install 수행 후, repo에 배포 수행.distributionManagement 항목이 기술되어야함.
Repository 저장소
Local Repository
Maven은 dependency 및 packaging한 프로젝트 결과물을 local에 특정 위치에 저장.
Linux & Mac : <홈디렉토리>/.m2
Windows : C:/Users/<유저이름>/.m2
사용자 지정 위치도 가능
.m2 디렉토리 하위에 dependency 및 packaging한 결과물들을 groupId, artifactId, versions값으로 하위 디렉토리구조가 생성이 되며 저장.
여러 프로젝트에서 중복된 라이브러리 다운로드를 피하기위한 목적.
Repository
의존성을 다운로드 받을 위치의 repository.
기술되지 않을 시 기본적인 위치.
다수의 <repository> 기술 가능.
회사 내부의 repository를 기술 하기도 한다.
...생략
<repositories>
<repository>
<id>spring-snapshot</id>
<name>Spring Snapshot Repository</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
Plugin Repository
maven plugin을 다운로드 받을수 있는 저장소 위치를 기술.
다수의 <pluginRepository> 기술 가능.
<pluginRepositories>
<pluginRepository>
<id>acme corp</id>
<name>Acme Internal Corporate Repository</name>
<url>http://acmecorp.com/plugins</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
Version
네이밍 없는 경우 : 릴리즈
SNAPSHOT
실험 중인 버전.
Daily build 버전.
새로 개발 중인 기능이 있을 수 있음.
M (Milestone)
SNAPSHOT 보다 정리가 잘 되어있는 버전.
실험 중인 버전.
새로 개발 중인 기능이 있을 수 있음.
RC (Release candidate)
Milestone 보다 더 정리가 잘 되어 배포된 버전.
해당 버전이 왠만하면 그대로 배포됨.
ga
scope
dependency 하위에 포함되는 항목. dependency 범위에 대한 선언.
compile
provided
외부 컨테이너에서 기본 제공되는 API인 경우 provided로 지정 시 마지막 패키징에서 제외됨.
tomcat에서 기본적으로 servlet api를 제공하기 때문에 servlet api를 provided로 지정하면 패키징시 제외됨.
runtime
컴파일 시에는 불필요하지만 실행시에 필요한 경우.
런타임 및 테스트 시 classpath에 추가 되지만, 컴파일시에는 추가 되지 않음.
test
system
system의 특정 path를 참조하도록 지정함.
Maven의 central repository를 사용하지 않음.
import
다른 POM 설정 파일에 정의되어 있는 의존 관계 설정을 현재 프로젝트로 가져옴. dependencyManagement에서만 사용가능.
Plugin
Goal
Maven에서 사용되는 clean, compile, package 등의 goal 명령어들도 사실상 plugin으로 내장되어 있음.
clean, compile, test, install, package, deploy
Compiler plugin
기본적으로 maven은 jdk 1.5 기준으로 compile을 시도함.
1.5버전보다 더 높은 버전으로 compile 하기위해서는 다음과 같은 조치가 필요함.
Jar plugin
jar 패키징된 파일을 실행하기 위해서 ManifestFile을 생성해주는 plugin
Source plugin
package 시에 Source 코드를 포함시킨다.
아래의 코드를 추가하면 package 수행 및 install 수행 시 기본jar명-sources.jar 파일이 추가로 하나 생성됨.
plugin 별로 고유의 goal이 있음.
Javadoc plugin
java doc 문서를 자동 발행해주는 플러그인
아래와 같이 java 코드에 문서화 주석을 html문서로 떨구어 줌.
Tomcat 배포 플러그인
tomcat-user.xml tomcat설치 경로 > conf아래에 존재함.