Maven이란?
- Java application의 빌드 도구
- Build tool : 프로젝트 생성, 테스트 빌드, 배포등의 작업을 위한 전용 프로그램
- 빠른 기간 동안 계속해서 늘어나는 라이브러리 추가, 프로젝틀르 진행하며 라이브러리의 버전 동기화의 어려움을 해소하고자 등장
- Maven은 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 내가 사용할 라이브러리 뿐만 아니라, 해당 라이브러리가 작동 하는데에 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해 자동으로 다운 받음
- Maven은 중앙 저장소를 통한 자동 의존성 관리를 중앙 저장소(Apache 재단에서 운영 관리)는 라이브러리를 공유하는 파일 서버라고 볼 수 있고, 메이븐은 자기 회사만의 중앙 저장소를 구축할 수도 있음.
- 간단한 설정을 통한 배포 관리가 가능.
Maven 장 단점
장점
- Compile과 Build를 동시에 수행할 수 있음
- 서버의 Deploy 자원을 관리할 수 있는 환경을 제공
- pom.xml 파일을 통해 관리하므로, 개발 및 유지보수 측면에서 오픈소스 라이브러리, 프로젝트 등 관리가 용이
- IDE에 종속된 부분들을 제거할 수 있음
- Maven Profile 기능을 통해 배포 설정 파일을 관리하고 배포 파일을 생성
단점
- Maven에서 기본적으로 지원하지 않는 build 과정을 추가해야 하는 경우 상당한 고생이 따름
- 특정 플러그인의 설정이 조금만 달라도 해당 설정을 분리해서 중복 기술할 때가 발생 → 불필요하게 설정이 길어지고, 중복/가독성 저하가 발생, 유지보수성을 떨어뜨림
⇒ 이러한 단점을 해결하기 위해 Gradle이라는 빌드 툴 등장
Maven 특징
- 미리 만든 프레임워크 이므로 미리 정의하고 있는 빌드 순서가 있음, 이 순서를 라이프 사이클이라고 함.
- Phase
- Maven의 각 빌드 단계를 지칭
- phase들은 의존 관계를 가지고 있음→ 해당 phase가 수행되기 위해서는 이전 단계의 phase가 모두 수행되어야 함.
- 모든 빌드 단계는 이전 단계가 성공적으로 실행 되었을 때, 실행됨. → Dependency
- 각각의 phase는 어떤 일을 할지 정의하지 않고 어떤 플러그인의 goal를 실행할 지 설정
- goal
- 플러그인에서 실행할 수 있는 각각의 기능(명령)
- Maven에서는 하나의 플러그인에서 여러 작업을 수행할 수 있도록 지원
- 각각의 Phase에 연계된 Goal을 실행하는 과정을 build라고 함.
Maven Life Cycle

Clean
- 빌드 시 생성되었던 파일들을 지우는 단계
Vaildate
- 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인하는 단계
Compile
- 프로젝트의 소스 코드를 컴파일 하는 단계
Test
- 유닛(단위) 테스트를 수행하는 단계(테스트 실패→빌드 실패로 처리, 스킵 가능)
Package
- 실제 컴파일 된 소스 코드와 리소스들을 jar, war 등등의 파일 등의 배포를 위한 패키지로 만드는 단계
Verify
- 통합 테스트 결과에 대한 검사를 실행해 품질 기준을 충족하는지 확인하는 단계
Install
- 패키지를 로컬 저장소에 설치하는 단계
Site
- 프로젝트 문서와 사이트 작성, 생성하는 단계
Deploy
- 만들어진 Package를 원격 저장소에 release 하는 단계
최종 빌드 순서
- Compile ⇒ Test ⇒ Package
- Clean → init → compile → test-compile → test → package → integration-test → verify → install → deploy → site
- Compile : src/main/java
- 해당 디렉토리 아래의 모든 소스코드가 컴파일
- Test : src/test/java, src/test/resources
- 테스트 자원 복사 및 테스트 코드 컴파일
- Packaging
- 컴파일과 테스트가 완료된 후 jar, war과 같은 형태로 압축하는 작업
Maven pom.xml 구조
- 다른 build tools와 다르게 선언적 접근 방법(Declarative Approach)를 사용
- 빌드 프로세스를 이벤트 단위로 기술하는 것이 아니라, 프로젝트를 설명하고, 프로젝트 구조에 대해서 정의하고 이와 관련된 연관 정보들을 기술하는 형태
- pom.xml에 들어가는 정보 내용
- 기본 정보
- 프로젝트 정의(Context, artifact 정의) → 필수
- 연관 정보(라이브러리 연관 관계, 상위 프로젝트 등 정보) → 필수
- 프로젝트 정보
- 선택
- 빌드 설정
- 빌드 정의(기본 설정 되어 있는 빌드 프로세스에 변경을 위하여 별도의 플러그인을 적용할 때 사용) → 선택
- 리포트 정의(빌드 프로세스에 대한 리포팅 뿐 아니라, 연관된 시스템과 결과 정보 등을 리포트로 만들기 위해 정의) → 선택
- 환경 설정
- 선택
- 기본 정보
- 최상위 태그는 <project> xml의 루트 태그
- 모든 pom.xml은 최상위 pom.xml을 참조
- Super POM, 재 정의 하지 않는 이상 기본 값으로 적용되어 동작
- Maven에서 기본적으로 제공하고 있는 것, 개발자가 만드는 모든 pom.xml은 이를 상속 받아 사용
- 주요 태그 별 설명
- <build>
- Maven의 기본 디렉터리 구조가 정의되어 있음.
- 이 정의를 변경하여 Maven의 기본 구조를 변경할 수 있음
- <version>
- Maven에서 version 에 대한 명명규칙을 SNAPSHOT과 RELEASE로 구분
- SNAPSHOT : 완성되지 않은 버전, RELEASE : 완성되어 공식 배포된 버전
- <properties>
- pom.xml 파일 내부에서 사용할 속성을 정의
- 주로 버전 정보와 같이 공통적으로 많이 사용하는 내용을 속성으로 정의
- <scm>
- 버전 관리 시스템과 연계하기 위한 정보를 기술
- <repositories>
- 메이븐 저장소 정보를 기술
- 주로 사내 사설 저장소의 정보를 사용
- <distributionManagement>
- 빌드의 결과물을 배포할 위치를 지정
- 주로 사내 사설 저장소의 정보를 사용
- <profiles>
- 특정 항목 혹은 특정 속성에 따라 빌드를 다르게 수행할 수 있음
- 하나의 pom.xml 파일로 개발, 테스트, 운영 환경에서 모두 실행 가능하도록 할 때 유용하게 사용
- <build>
- 최소 pom
<project>
<modelVersion></modelVersion>
<groupId></groupId>
<artifactId></artifactId>
<version></version>
</project>
- 우리가 흔히 아는 오픈소스 라이브러리 등에 대한 참조 정보 역시 해당 라이브러리 프로젝트 속성 정보 3개를 이용
- 향후 Maven 중앙 저장소, 사설 저장소에 등록해서 관리해야 하는 ㄱ영우 등록을 위한 필수 키도 바로 이 3개 항목
- groupId
- 프로젝트 구분하기 위해 사용, 일반적으로 도메인 명을 주로 사용
- 전 세계의 수 많은 개발자들이 만들어내고 있는 Maven 기반 프로젝트들과 중복되지 않도록 정의하는 명명 규칙
- artifactId
- 프로젝트 이름으로 인식하는 경우가 많음
- groupId와 artifactId를 조합해서 식별자로 사용
- groupId:artifactId:version형태로 문장을 만들어 메이븐 주소라고 부름
간단한 예제를 통해 Maven 프로젝트 생성 → 패키징
https://jhleeeme.github.io/create-jar-with-maven-in-vscode/
Maven으로 jar파일 생성 & 실행 | 내가 다시 보려고 만든 블로그
OS는 Ubuntu18.04vscode상에서 진행한다.시나리오 Maven Project 생성 & Run jar파일 생성 & Run1. Maven Project 생성 & Runtest라는 폴더 안에 Maven Project를 생성하고, 돌려보았다. grou...
jhleeeme.github.io
감사히도 잘 설명해주시는 blog를 찾음
참고 한 자료들..
늘 좋은 글 감사합니다..!
'CS 기초' 카테고리의 다른 글
| [OS] Zero Copy (0) | 2023.07.14 |
|---|---|
| Java 개념 정리 (0) | 2023.05.23 |
| [CS 기초] 03. 캐시 메모리(Cache Memory) (0) | 2022.12.01 |