04. Apache Maven ( 2004 - )
Maven은 "전문가"라는 뜻의 이디시어에서 따온 Ant의 대안 프로젝트다. Maven 프로젝트는 자바 기반 오픈소스들을 모아서 지원하기 위한 아파치의 자카르타 프로젝트 중에서 Servlet기반의 자바 웹 프레임워크인 터빈의 빌드 과정을 단순화하기 위해 시작되었다. 초기 터빈에는 몇 개의 Ant 빌드 파일이 존재했는데, Ant의 빌드 파일에는 어떠한 기준이 없으므로 서로 조금씩 달라서 어려움이 있었다. 따라서 이를 해결하기 위해 어떤 기준, 즉 프로젝트를 빌드하는 방법, 프로젝트 구성에 대한 명확한 정의, 프로젝트 정보를 게시하는 쉬운 방법, 그리고 여러 프로젝트에 걸쳐 jar파일을 공유하는 방법에 대한 기준이 필요했다. 그리고 그 결과가 Maven이다.
Maven이 Ant와 구별됐던 큰 이점은 외부 라이브러리를 참조해 자동으로 다운로드 및 업데이트 등의 관리를 해준다는 점이다. 물론 Ant도 이후 확장 프로젝트인 Ivy가 추가되면서 종속성 관리가 가능해졌다. 어쨌든 예전에는 내 프로젝트와 정확히 호환되는 버전의 라이브러리를 인터넷에서 찾아서 다운로드받고 내 프로젝트에 추가해야 됐었다면, Maven이 등장한 이후로는 Maven이 알아서 내 프로젝트와 호환되는 외부 라이브러리를 Maven Repository에서 찾아서 추가시켜준다.
시작하기
메이븐을 시작하는 방법은 여러가지가 있다. 여기서는 직접 공식 홈페이지에서 설치한 뒤 CLI를 이용해 프로젝트를 시작하는 방법, 이클립스를 이용하는 방법 두 가지를 알아보려고 한다.
1. CLI
메이븐 공식 홈페이지에서 각 OS에 맞는 버전을 설치하고 환경변수로 등록해주면 된다.
mvn archetype:generate
위의 명령어를 CLI에 입력하면 mvn 프로젝트를 구성할 수 있다. 안내에 따라 진행하면 되는데, 잘 모르는 부분이 있다면 아래의 매개변수를 포함한 코드를 입력해서 빠른 프로젝트를 시작하거나 아래 설명을 보자.
mvn Archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
위와 같이 매개변수를 추가해서 입력해주면 안내 없이 바로 기본적인 메이븐 프로젝트를 생성할 수 있다. 뒤에 붙어 있는 -D로 시작하는 파라미터들은 프로젝트를 생성하는데 필요한 정보들을 미리 기입해 놓은 것이다. 먼저 archetypeArtifactId가 중요한데, 이것은 Maven 프로젝트 템플릿이다. 여기서는 Maven이 기본적으로 제공하거나, 다른 조직이나 개인이 만든 여러 유형의 프로젝트 구조나 예제 코드를 포함한 Maven 프로젝트를 생성할 수 있다.
2023년 10월 24일 현재 총 3327개의 archetype 중에 하나를 선택할 수 있고, 그냥 Enter를 입력하면 가장 기본적인 형태인 2082번의 maven-archetype-quickstart가 선택된다. groupId는 프로젝트를 생성한 조직이나 그룹의 고유 식별자를 나타내는 요소로, 주로 해당 회사의 도메인이름을 거꾸로 적는다. 예를 들어 구글에서 진행하는 프로젝트라면 com.google 이런 식이다. artifactId는 실제 프로젝트의 이름을 적는다. 이 artifactId와 뒤에 나오는 버전명을 합쳐서 jar파일이 만들어지니 실제 내가 만들고자 하는 결과물의 이름을 적으면 되겠다. 다음으로는 version인데, 아티팩트의 버전을 적는다. 기본값으로는 1.0-SNAPSHOT이라는 버전명이 들어간다.
나는 newApp이라는 아티팩트명으로 프로젝트를 만들었다. 이제 cd [아티팩트명]으로 프로젝트에 진입하면 이렇게 POM과 실제 코드가 들어 있는 src폴더가 생성되어 있다. POM에 대해서는 다음 절에서 자세하게 설명하겠지만 간단하게 설명하면 다음과 같다.
POM을 열어보면 다음과 같이 우리가 방금 작성한 프로젝트 이름들이 잘 들어가 있다. POM은 메이븐이 프로젝트를 관리하는데 필요한 모든 정보를 담고 있는 파일이다. 이 파일을 이용해서 프로젝트 관리 및 의존성 관리까지 한번에 할 수 있다.
modelVersion은 POM의 버전으로 maven 2.x버전 이상부터는 4.0.0을 사용하니 굳이 건들 필요없다. 맨 아래의 maven.compiler.source와 maven.compiler.target은 프로젝트에서 JDK버전을 특정해서 컴파일해야 할 때, 메이븐이 컴파일할 JDK버전을 명시해주면 메이븐이 버전에 맞게 컴파일 해준다. 하지만, 100% 장담할 수 없으니 보통은 사용중인 버전과 컴파일 버전을 맞춘다. 후술하겠지만 이클립스에서는 이 부분이 변경되면 알아서 JRE Library를 맞춰준다.
mvn package
우리가 생성한 quickstart라는 archetype은 Hello World!를 출력하는 예제 java코드가 기본적으로 생성된다. 위와 같은 명령어를 입력하고 실행하면 메이븐이 알아서 compile하고 test하고 package해서 java코드를 jar파일로 빌드한다.
BUILD SUCCESS가 떴다면 올바르게 빌드 과정이 완료된 것이다. 새로 생긴 target 폴더에 들어가보면 newApp-1.0-SNAPSHOT.jar라는 이름으로 새로운 jar파일이 생성된 것을 확인할 수 있다. jar파일이 잘 생성됐는지 한번 테스트해보자
java -cp target/newApp-1.0-SNAPSHOT.jar com.churnobyl.App
다음과 같이 java를 실행하는데 -cp(classpath)매개변수로 jar파일을 지정해주고 그 안에 있는 com.churnobyl.App을 실행하도록 했다.
다음과 같이 Hello World!가 잘 출력됐다. 이렇게 메이븐을 이용하면 자바 프로젝트를 명령어 몇 개만으로 jar파일이나 원하는 타입의 결과물로 빌드할 수 있다.
2. 이클립스
이클립스는 메이븐을 공식적으로 지원한다. 이클립스가 제공하는 기능을 이용하면 CLI로 번거로웠던 작업들을 조금 더 간편하게 할 수 있다. 이클립스를 실행하고 'File - New - Maven Project', 없다면 Other을 선택해 maven을 검색하면 Maven Project를 생성할 수 있다.
Create a simple project를 체크하면, CLI로 메이븐 프로젝트를 생성했을 때 archetype을 선택했던 과정을 스킵하고 이클립스에서 기본적으로 설정한 메이븐 프로젝트로 설정한다. Working set은 Workspace만으로 프로젝트 분류가 어려운 큰 단위의 프로젝트에서 여러 개의 프로젝트를 묶는 단위로 이클립스에서 제공하는 기능이다. 적당히 설정하고 다음으로 넘어가자.
다음으로 넘어가면 CLI에서 했던 과정들이 한번에 GUI로 나온다. 한결 편하다.
Finish를 누르면 프로젝트 생성이 완료되고 다음과 같이 메이븐 프로젝트가 생성된 것을 볼 수 있다. 이클립스에서는 Ctrl + F11키로 간단하게 자바파일을 실행할 수 있고 '프로젝트 우클릭 - Run As - Maven install' 등과 같은 옵션을 이용해서 빌드할 수도 있다. 이클립스는 편하다.
pom.xml을 보면 다음과 같이 메이븐 컴파일러 버전이 1.7로 되어 있다. 나는 17버전을 쓰기 때문에 메이븐 컴파일러 버전도 17버전으로 맞추고 싶다. 그럴 때는 그냥 1.7을 둘 다 17로 바꿔주고 Update Project를 해주면 이클립스가 알아서 시스템 라이브러리를 맞춰준다.
이렇게 간단하게 컴파일러 버전을 수정할 수도 있다. 그 밖에도 pom.xml을 수정하는 일이 생긴다면 이렇게 업데이트를 해주어야 한다. 여기까지가 메이븐을 사용하는 아주 간단한 방법이다.
라이프 사이클(Life Cycle)
build.xml에다가 모든 빌드 동작 순서를 일일이 기입해주어야 했던 Ant와는 달리, Maven은 반복적인 빌드 프로세스를 명확하게 정의해 놓았다. 그것을 Maven의 라이프 사이클이라고 한다. 따라서 Maven으로 프로젝트를 빌드하려는 사람은 그냥 명령어만 입력하면 된다. 그럼 Maven이 POM을 참고해서 빌드 과정을 자동으로 수행한다.
기본적으로 제공하는 라이프 사이클은 크게 세 가지가 있다. 기본(Default), 정리(Clean), 사이트(Site). Default는 프로젝트 배포 과정을 처리하는 라이프 사이클, Clean은 프로젝트를 정리하는 라이프 사이클, Site는 프로젝트로 웹 사이트를 생성하는 라이프 사이클이다.
각 라이프 사이클은 다시 validate, compile, test, package , ..., deploy 등과 같은 각 단계(Phase)로 나누어진다. 이 단계들은 일련의 순서가 있다. 예를 들어 빌드를 수행하면 먼저 validate단계에서는 프로젝트의 모든 정보들이 정확한지 확인하고, compile단계에서는 소스 코드를 실제로 컴파일하고, test단계에서는 테스트 프레임워크를 사용해 컴파일한 소스 코드를 테스트한다. 그 대표적인 단계 중간 중간에도 더 세밀한 단계들이 있지만 주로 사용하는 단계는 이와 같다.
기본적으로 메이븐이 제공하는 라이프 사이클은 위의 그림과 같으며, 주로 사용되는 단계는 진한 파란색들이다. 예를 들어 내가 test단계까지 진행하고 싶다면 단순히 pom.xml이 있는 폴더에서 다음과 같은 명령어를 입력하면 된다.
mvn test
그럼 다음과 같이 validate단계, compile단계를 거쳐 test단계까지 진행한 뒤 빌드 과정이 마무리된다. 즉 소스 코드가 정확한지 확인하고 컴파일한 뒤 컴파일한 class파일을 검증하는 단계까지 진행되는 것이다. 다시 clean명령을 실행해 빌드했던 파일을 깨끗이 지우고 다시 package단계까지 진행하면 어떻게 될까. package단계는 jar과 같은 배포 가능한 형식으로 패키징하는 단계다.
mvn clean package
참고로 다음과 같이 빌드 단계를 연이어 작성하면 메이븐이 빌드 단계를 순서대로 진행한다.
빌드가 마무리된 뒤 target폴더에 보면 jar파일이 잘 생성된 것을 볼 수 있다. 이렇게 빌드 단계를 명령어로 입력하는 것만으로 메이븐 프로젝트에서 유의미한 결과물을 만들 수 있다. 하지만 메이븐을 조금 더 딥하게 사용하고 싶다면 목표(Goal)와 플러그인(Plug-in)을 알아야 한다. 이 부분은 추후에 Maven을 좀 더 다뤄본 뒤에 글을 쓰도록 하겠다.
'프로그래밍 > Java' 카테고리의 다른 글
[Java] Java기초 - (3) 배열 (0) | 2023.11.01 |
---|---|
[Java] Java Build Tools 발전과정 - (3) Gradle (0) | 2023.10.27 |
[Java] Java Build Tools 발전과정 - (1) Make vs Ant (0) | 2023.10.20 |
[Java] Java기초 - (2) 기초 문법 - 연산자 (0) | 2023.10.18 |
[Java] Java기초 - (2) 기초 문법 - 변수와 리터럴 (0) | 2023.10.12 |