Maven이란

  • 프로젝트 빌드툴 중 하나
  • maven, gradle, ant 등이 있다.
  • 프로젝트 빌드 과정
    • 프로젝트 생성
    • 라이브러리 설정
    • 코딩
    • 컴파일
    • 테스트
    • 패키지 만들기
    • 배포
    • 레포팅

Maven 설치

  • https://maven.apache.org 에서 Binary zip archive 파일을 다운로드하여 압축을 푼다.
  • maven 환경변수 설정
    • 환경변수를 설정하지 않으면, 해당 디렉토리로 이동하여야 mvn 명령어를 사용할 수 있다.
    • M2_HOME을 압축을 푼 홈 디렉토리로 설정(ex) D:\tools\apache-maven-3.6.3-bin)
    • %M2_HOME%\bin 을 설정하면 mvn 명령어를 사용할 수 있다.
    • cmd 창에 mvn -version으로 제대로 설정되었는지 확인 가능

Java 프로젝트 생성하기

  • mvn archetype:generate -DgroupId=com.newlecture -DartifactId=javaprj -DarchetypeArtifactId=maven-archetype-quickstrat
    • 구분자가 -D이다.
    • archetype:generate -> archetype 생성 명령
    • archetypeArtifactId=maven-archetype-quickstrat -> 다른 사람이 만든 maven-archetype-quickstart라는 프로젝트 구조를 기본으로 한다.
      • 프로젝트 생성 시 기존에 존재하는 archtype을 활용할 수 있다.
    • artifactId=javaprj -> 프로젝트 이름을 javaprj로 생성
    • groupId=com.newlecture -> 프로젝트 이름이 충돌되지 않도록 그룹 ID 설정, 패키지명과 동일

Maven 프로젝트 컴파일과 실행

  • pom.xml
    • 메이븐 프로젝트는 항상 root에 pom.xml 파일이 존재한다.
    • 프로젝트를 컴파일, 실행할 때에는 반드시 pom.xml이 있는 root에서 실행해야 한다.
  • mvn compile
    • 컴파일 한다.
    • 컴파일을 완료하면 target에 클래스(바이너리 코드)가 생성된다
  • mvn package
    • 패키지(JAR)를 생성한다.
  • 실행 방법
    • classes 폴더 및에 main 메소드가 있는 Class파일을 실행할 수 있다.
    • 패키징된 JAR 파일을 실행할 수 있다.
      • java -cp target\javaprj-1.0-SNAPSHOT.jar com.newlecture.App
        • javaprj-1.0-SNAPSHOT.jar 라이브러리를 클래스패스(-cp)로 설정하여 App.class 실행

Build Lifecycle

  • Build Lifecycle

    Lifecycle Description
    validate validate the project is correct and all necessary inforamtion is available
    compile compile the source code of the project
    test test the compiled source code using a suitable unit testing framework. These tests sould not require the code be packaged or deployes
    package take the compiled code and package it in its distrubutable format, such as JAR
    verify run any checks on results of integration tests to ensure quality criteria are met
    install install the package into the local repository, for use as a dependency in other projects locally
    deploy done in the build environment, copies the final package to the remote repository for sharing with other developers and projects
  • goal
    $ mvn [goal명령어] [goal명령어] [goal명령어] 
    
    • Maven이 행할수 있는 여러가지 동작을 수행하는 명령을 Goal이라고함
    • 실행 방식, 체인 형태로 실행가능
  • pom.xml에 설정된 packaging에 따라 다를 수 있다.
    • jar

      으로 설정했을 때에 phases이다.

    • mvn compile을 하면 validate부터 compile 까지에 phases가 실행된다.
    • mvn package를 하면 validate부터 package 까지에 phases가 실행된다.
      <phases>
          <phase>validate</phase>
          <phase>initialize</phase>
          <phase>generate-sources</phase>
          <phase>process-sources</phase>
          <phase>generate-resources</phase>
          <phase>process-resources</phase>
          <phase>compile</phase>
          <phase>process-classes</phase>
          <phase>generate-test-sources</phase>
          <phase>process-test-sources</phase>
          <phase>generate-test-resources</phase>
          <phase>process-test-resources</phase>
          <phase>test-compile</phase>
          <phase>process-test-classes</phase>
          <phase>test</phase>
          <phase>prepare-package</phase>
          <phase>package</phase>
          <phase>pre-integration-test</phase>
          <phase>integration-test</phase>
          <phase>post-integration-test</phase>
          <phase>verify</phase>
          <phase>install</phase>
          <phase>deploy</phase>
      </phases>
      
  • plug-in
    • 각 phase마다 plug-in 방식으로 끊어놓았고, 각 단계마다 실행하는 프로그램이 따로 존재한다.
    • 단계 실행할 때 사용하는 프로그램을 plug-in이라 한다.
    • 단계마다 사용하는 plug-in 설정은 pom.xml에서 실행할 수 있다.
    • JAR 패키징할 때 기본적으로 매핑되는 plug-in + 세부단계, 서술하지 않는 phases는 not defined이다.

      phases plug-in + 세부 단계
      process-resources org.apache.maven.plugins:maven-resources-plugin:2.6:resources
      compile org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
      process-test-resources org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
      test-compile org.apache.maven.plugins:maven-compiler-plugin:3.1:testCopmile
      test org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
      package org.apache.maven.plugins:maven-jar-plugin:2.4:jar
  • plug-in 재정의
    • pom.xml에서 plug-in 설정을 오버라이딩 할 수 있다.
      <build>
          <plugins>
              <plugin>
                  <artifactId>maven-compiler-plugin</artifactId>
                  <version>3.8.1</version>
                  <configuration>
                      <source>1.8</source>
                      <target>1.8</target>
                  </configuration>
              </plugin>
          </plugins>
      </build>
      
  • maven repository
    • pom.xml -> dependecies 안에 dependency로 설정
      • maven repository에 저장되어 있는 artifact를 로컬에 저장하여 사용한다.
      • local repository는 ${user.home}/.m2/repository 로 설정되어 다운로드된다.
    • dependency에 필요로 하는 artifact를 설정하면 해당 artifact에서 사용하는 의존성들을 함께 가져온다.
    • 라이브러리 오류 발생 시 해결 방법
      • JAR 파일이 깨지거나 안에 생성되는 class 파일이 깨지는 경우가 발생할 때
      • 열어 두었던 IDE를 닫고, ${usr.home}/.m2/repository 밑에 있는 파일을 다 지운 후, IDE를 다시 실행한다.
      • 의존성에 추가되었던 artifact를 다시 가져옴으로써 깨진 파일을 다시 가져올 수 있다.
      • 필요 시 maven update project 실행
    • 내가 만든 라이브러리 설치하기
      • 내가 만든 프로젝트 -> mvn install 실행 : 로컬 레퍼지토리에 JAR파일이 생성된다.
      • Local Repository를 rebuild하면 내가 만든 라이브러리를 확인할 수 있다.
      • add 하면 된다.