Maven

3 분 소요

Maven

  • 프로젝트의 전체적인 라이프 사이클(프로젝트 생성, 테스트 빌드, 배포 등)을 관리하는 관리 도구.
  • POM(Project Object Model, 프로젝트 객체 모델)개념을 바탕으로 프로젝트의 의존성 관리, 라이브러리 관리, 프로젝트 라이프사이클 관리 기능등을 제공함.
  • 플러그인 기반으로 소스코드로부터 배포 가능한 산출물을 만들어내는 기능을 제공한다. 즉, 소스코드 및 각종 리소스(xml, 이미지, properties 등)을 JVN 또는 WAS가 인식할 수 있는 구조로 패키징 해줌.

대표기능

  • 빌드 툴
    • 항상 하나의 컴포넌트로 빌드된다.
    • 의존성 관리
    • 빌드 수행 후 리포트 생성
  • 패키징
    • war, jar, exe 등의 배포 가능한 포멧의 파일 생성
  • 프로젝트 관리
    • 버전과 릴리즈 관리
    • 프로젝트 명시 및 개발 기록
    • javadoc 쉽게 작성 가능
  • 테스트
    • 단위 테스트 수행
    • 빌드 결과 점검
  • 배포
    • 해당 프로젝트의 버전 관리를 위해 (운영 서버가 아닌)특정 원격 저장소에 배포
    • 빌드 후 생성된 컴포넌트를 로컬 혹은 원격 저장소에 배포

Maven 프로젝트 생성 흐름

  1. 특정 프로젝트 경로 최상위에 pom.xml 생성 ```
{ 프로젝트의 그룹명, 유니크한 명칭이어야 함. } { 프로젝트(컴포넌트) 명칭, groupId 단위 내에서 유일해야함. } { pom.xml을 이루고 있는 maven.xml 문서 형식의 버전. 무조건 (4.0.0) 이다. } { 해당 artifact(컴포넌트)의 version, 뒤쪽 SNAPSHOT은 아직 개발 중임을 의미. } { jar, war, exe 등 어떤 파일 형식으로 패키징 할 것인가를 정의. }
2. compile 버전 정보 입력
... 생략 ... org.apache.maven.plugins maven-compiler-plugin 3.7.0 { 소스코드 Java 버전(ex 1.8) } </source> { compile시 결과물 Java 버전(ex 1.8) }
3. 코드 작성
4. 빌드
   * compile 후 target 디렉토리가 생성되며 컴파일된 결과물이 만들어짐.
5. 실행
6. 패키징

## 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.
  * 기술되지 않을 시 기본적인 위치.
    * http://repo.maven.apache.org/maven2
  * 다수의 <repository> 기술 가능.
  * 회사 내부의 repository를 기술 하기도 한다.
    * nexus
    * artifactory를 이용

…생략

spring-snapshot Spring Snapshot Repository https://repo.spring.io/snapshot true false
* Plugin Repository
  * maven plugin을 다운로드 받을수 있는 저장소 위치를 기술.
  * 다수의 <pluginRepository> 기술 가능.
acme corp Acme Internal Corporate Repository http://acmecorp.com/plugins true false

```

Version

  • 네이밍 없는 경우 : 릴리즈
  • SNAPSHOT
    • 실험 중인 버전.
    • Daily build 버전.
    • 새로 개발 중인 기능이 있을 수 있음.
  • M (Milestone)
    • SNAPSHOT 보다 정리가 잘 되어있는 버전.
    • 실험 중인 버전.
    • 새로 개발 중인 기능이 있을 수 있음.
  • RC (Release candidate)
    • Milestone 보다 더 정리가 잘 되어 배포된 버전.
    • 해당 버전이 왠만하면 그대로 배포됨.
  • ga
    • 최종 release 버전.

scope

  • dependency 하위에 포함되는 항목. dependency 범위에 대한 선언.
    • compile
      • default scope
    • 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아래에 존재함.

댓글남기기