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 : 이 프로젝트에 대한 사이트 문서 생성.