본문 바로가기
Spring

Maven in five minutes(Maven Tutorial)

by k0o9 2021. 1. 5.

maven.apache.org/guides/getting-started/maven-in-five-minutes.html

 

Maven – Maven in 5 Minutes

Java 9 or later By default your version of Maven might use an old version of the maven-compiler-plugin that is not compatible with Java 9 or later versions. To target Java 9 or later, you should at least use version 3.6.0 of the maven-compiler-plugin and s

maven.apache.org

메이븐 공부를 위해 maven.apache에 있는 Maven in 5 Minutes를 간단하게 공부해 보겠습니다. 메이븐 설치는 다루지 않겠습니다.

Maven?

아파치 메이븐(Apache Maven)은 자바용 프로젝트 관리 도구이다. 아파치 앤트의 대안으로 만들어졌다. 아파치 라이선스로 배포되는 오픈 소스 소프트웨어이다.

출처:위키백과

 

메이븐은 위의 사전적 정의처럼 프로젝트 관리를 위한 빌드 도구이다. 좀 더 자세히 말하자면 pom.xml에 내가 필요한 라이브러리를 명시하면 명시한 라이브러리와 의존관계에 있는 라이브러리 조차 모두 가져와 주는 도구이다. 

 

프로젝트 생성

mvn archetype : generate -DgroupId = com.mycompany.app -DartifactId = my-app -DarchetypeArtifactId = maven-archetype-quickstart -DarchetypeVersion = 1.4 -DinteractiveMode = false

 

위의 명령어로 프로젝트를 만들면 my-app이라는 폴더가 생긴것을 볼 수 있다. 자 그럼 이제 위의 명령어를 해석해봅시다. archetype: generate를 실행하고 해당 목표에 매개변수를 전달해줬습니다. maven-archetype-quickstart 을 기반으로 단순한 프로제그를 생성했습니다. 

 

archetype이란?

미리 만들어둔 maven project templeate으로서 maven project를 생성할때 사용하는 plugin입니다.

archetype: generate를 자세히 알고 싶으면 maven.apache.org/archetype/maven-archetype-plugin/generate-mojo.html에 들어가서 공부해보자

Maven 프로젝트 구조

자 my-app을 intelij로 열어보니 프로젝트가 저렇게 구성된 것을 볼 수 있다.

 

Maven의 구조를 간단히 살펴보면 src/main/java 는 프로젝트의 소스코드를 포함하고 src/test/java는 테스트 소스를 포함한다. pom.xml파일은 밑에서 다루도록 하겠다.

 

POM

Maven 프로젝트 구성의 핵심. 프로젝트를 빌드하는데 필요한 대부분의 정보가 포함된 단일 구성파일이다. 

즉 프로젝트의 구조와 내용, 프로젝트 관리 및 빌드에 필요한 환경설정 ,의존성 등을 관리하는 매우 중요한 파일이다.

<?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.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>my-app</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

pom.xml 을 열어보니 저러한 정보들이 담겨 있는 것을 볼 수 있었다.

 

프로젝트 구축

mvn package라는 명령어를 실행하면 

이렇게 빌드가 되는 것을 확인할 수 있다. 

자 그럼 이제 이러한 

Maven Build Life Cycle을 살펴보자

 

Maven Build Life Cycle

1.valid :  POM 의 유효성을 검증하는 단계

2.generate-sources : 소스코드를 생성하는 단계

3.process-source : 소스코드 생성 결과를 처리하는 단계

4.generate-resources : 리소스를 생성하는 단계

5.process-resources : 리소스를 처리하는 단계

6.compile : 소스를 target 디렉토리에 컴파일.

 

자 그럼 이제 새로 컴파일된 jar을 테스트 해보자 

java -cp target / my-app-1.0-SNAPSHOT.jar com.mycompany.app.App

의 명령어를 실행 하면 

잘 출력되는 것을 볼 수 있다. 위에 java -cp 명령어가 잘 이해 되지 않는다면 cmd로 자바 컴파일하기를 참조해보자.

 

Maven Life Cycle

매이븐의 실행 단위를 Goal 이라고 한다. 이러한 골들이 상호연관 실행되는 것을 Maven Life Cycle이라고 하며 메이븐 골의 생명주기라고도 한다.

 

1.validate : 프로젝트가 정확하고 필요한 정보들을 사용할 수 있는지 확인 => pom.xl확인

2.compile : 의존성을 가져오고,target/classes 디렉토리에 프로젝트 소스 코드 컴파일

3.test : 적절한 단위 테스트 프레임워크를 사용하여 소스코드 테스트

4.package : 컴파일된 코드를 가져와 jar과 같은 배포 가능한 형식으로 패키징

5.integration-test : 통합테스트를 실행할수 있는 환경으로 패키지를 처리하고 배포.

6.verify : 모든 검사를 실행하여 패키지가 유효한지? 품질기준을 충족하는지? 확인.

7.install : 빌드된 결과물을 내부 메이븐 저장소로 보낸다. => 패키지를 로컬저장소로 보냄.

8.deploy : 결과물을 배포. => 패키지를 원격 저장소에 배포.

 

위의 8단계를 기본 주기 단계이며 위의 단계 말고도 다른 Maven life cycle이 있다.

-clean : 이전 빌드에서 생성된 아티팩트 정리

-site : 이 프로젝트에 대한 사이트 문서 생성.