Maven

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

대표기능

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

Maven 프로젝트 생성 흐름

  1. 특정 프로젝트 경로 최상위에 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>
  1. 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>
  1. 코드 작성
  2. 빌드
    • compile 후 target 디렉토리가 생성되며 컴파일된 결과물이 만들어짐.
  3. 실행
  4. 패키징

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를 기술 하기도 한다.
      • nexus
      • artifactory를 이용
  ...생략   
  <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
    • 최종 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아래에 존재함.