본문 바로가기
Spring Boot

Maven과 pom.xml 분석

by byeongoo 2020. 1. 4.

1. Maven이란?

Maven은 자바 프로젝트의 빌드를 자동화 해주는 빌드툴입니다. 요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 네트워크를 통해서 라이브러리들을 자동으로 다운받아줍니다. Maven이 없었다면 필요한 jar파일들을 일일이 받아서 직접 넣어줬어야 했을 것입니다.

 

이클립스에서 프로젝트를 클릭하고 Run as 목록을 보면 maven관련 항목들을 볼 수 있습니다. 습관적으로 Maven Update를하고 Maven Install 버튼을 클릭하는데 각각이 하는 역할에 대해서 알아보겠습니다.

 

  • Maven build : 메이븐 빌드를 실행한다.

  • Maven build.... : 새로운 사용자 빌드를 만든다.

  • Maven clean : target에 지정된 모든 소스를 삭제한다.

  • Maven generate-sources : 컴파일 과정에 포함될 소스를 생성한다.

  • Maven install : Local Repository에 패키지를 복사한다.

2. Maven Lifecycle 이란

Maven에서는 clean, build, site의 세 가지 Lifecycle을 제공하고 있습니다. 컴파일(compile), 테스트(test), 패키지(package), 배포(depooy)등의 과정은 빌드 Lifecycle에 속합니다. Maven은 모든 빌드 단위에 대한 Lifecycle이 예약되어 있어서 개발자가 임의로 변경 할 수 없습니다. 각 Lifecycle은 순서를 갖는 단계(phase)로 구성됩니다. Maven의 기본 Lifecycle을 이해하려면 Phase와 Goal의 개념을 이해해야 합니다.

 

아래의 그림에서 처럼 compile, test, pacakge 등의 과정은 Build Lifecycle에 속합니다. 

또한 Maven은 모든 빌드단위에 대한 Lifecycle이 예약되어 있어서 개발자가 임의로 변경 할 수 없습니다.

 

 

 

 

process-resources

  • resources:resources Goal이 실행

  • resource 디렉토리에 있는 내용을 target/classes로 복사

  • Maven Resources Plugin

  • <resource> directory(/src/main/resources)를 <outputDirectory>에 생성

compile

  • resources:resources, compiler:compile Goal이 실행

  • src/java 밑의 모든 자바 소스를 컴파일하여 target/classes로 복사

  • Maven Compiler Plugin

test-compile

  • compiler:compile, compiler:testCompile Goal이 실행

  • test/java의 내용을 target/test-classes로 복사

  • 테스트 소스 코드를 컴파일 한다.

test

  • compiler:compile, compiler:testCompile, surefire:test Goal이 실행 된다.

  • surefire:test의 실행으로 target/test-classes에 있는 테스트케이스 단위테스트 진행

  • Maven Surefire Plugin

  • junit과 같은 테스트 코드를 실행, 테스트가 실패하면 빌드를 멈춤

  • target/surefie-reports디렉토리 안에 test 리포트 파일을 생성한다

  • 단위 테스트 코드가 깨져도 빌드를 성공시키려면 maven.test.skip 속성을 true로 설정하면 된다.

    <properties> <maven.test.skip>true</maven.test.skip> </properties>

package

  • package를 실행하면 compile, test-compile, test 순으로 실행된 다음 jar, war파일이 target 디렉토리 아래에 생성. 

  • 이름은 <build>의 <finalName>의 값을 사용함. 지정되지 않았을 경우 "artifactId-version.extention" 으로 생성

  • 패키징에 따라 아래의 플러그 인을 사용한다.

  • Maven Jar Plugin

  • Maven WAR Plugin

  • Maven EAR Plugin

install

deploy

  • 원격 리파지토리에 등록하여, 다른 프로젝트에서 사용 할 수 있음

  • Maven Deploy Plugin

clean

site 

  • target/site에 문서 사이트 생성

site-deploy

  • 문서 사이트를 서버에 배포

3. pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
 
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
 
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

프로젝트 정보 관련 내용

  • <modelVersion> : maven의 pom.xml의 모델 버전

  • <groupId> : 프로젝트를 생성한 조직 또는 그룹명으로 보통, URL의 역순으로 지정

  • <artifactId> : 프로젝트에서 생성되는 기본 아티팩트의 고유 이름. 일반적으로 소프트웨어 분야에서는 소프트웨어 개발 프로세스에 의해 생산되는 소프트웨어와 관련된 문서나 실행 파일. 메이븐 빌드의 결과로 얻을 수 있는 일반적인 jar이나 war 또는 다른 실행 파일 의미. 메이븐에 의해 생성되는 일반적인 artifact는  <artifact>-<version>.<extention>(ex demo-0.0.1-SNAPSHOT.jar).  

  • <version> : 애플리케이션의 버전. 접미사로 SNAPSHOT이 붙으면 아직 개발단계라는 의미

  • <packaging> : jar, war, ear, pom 등 패키지 유형 나타냄

  • <description> : 프로젝트 설명

  • <url> : 프로젝트를 찾을 수 있는 URL

  • <parent> : pom.xml은 상속을 받을 수 있음. 스프링부트의 경우 부모 pom.xml에 자주 사용하는 라이브러리들의 버전 정보나 dependency들을 이미 가지고 있어서 참조하기 편리함.

설정 관련 내용

  • <properties> : pom.xml에서 중복해서 사용되는 설정 값 지정. 다른 위치에서 ${..}로 표기해서 사용 가능

  • <profiles> : dev, qa, prod 처럼 개발할 때 릴리즈할 때를 나눠야할 필요가 있는 설정 값 설정 maven goal 부분에 -P 옵션으로 프로파일 선택 가능. "mvn compile -P prod" 라고 하면 ${jave.version}은 1.9가 됩니다.

  • <dependencies> : 의존성 라이브러리 정보 기입. groupId, artifactId, version 정보는 필수 기입. 

빌드 설정

  • <plugin> : 메이븐은 플러그인을 구동해주는 프레임워크. 메이븐은 여러 플러그인으로 구성되어 있으며, 각각의 플러그인은 하나 이상의 goal(명령, 작업)을 포함. Goal은 Maven의 실행 단위. 메이븐은 여러 goal을 묶어서 lifecycle phase로 만들고 실행

 

플러그인 목록

  • <executions> : 플러그인 goal과 관련된 실행에 대한 설정

  • <configuration> : 플러그인에서 필요한 설정 값 지정 

REFERENCE