-
Maven에 대해서 알아보자JAVA/Java 2020. 8. 30. 20:29
메이븐 이란?
자바용 프로젝트 빌드, 관리에 사용되는 도구이다. 아파치 앤트(Ant)의 대안으로 만들어졌다. 아파치 라이선스로 배포되는 오픈 소스 소프트웨어이다.
메이븐의 특징은?
1. 빌드 절차를 간소화하는 빌드 도구이다.
빌드란?
-
소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정, 결과물
-
ex) 우리가 작성한 소스코드(java), 프로젝트에서 쓰인 각각의 파일 및 자원 등(. xml,. jpg,. jar,. properties)을 JVM이나 톰캣 같은 WAS가 인식할 수 있는 구조로 패키징 하는 과정 및 결과물이라고 할 수 있다.
빌드 도구란?
-
빌드 도구란 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램.
-
빠른 기간 동안 계속해서 늘어나는 라이브러리 추가, 프로젝트를 진행하며 라이브러리의 버전 동기화의 어려움을 해소하고자 등장
-
초기의 java 빌드 도구로 Ant를 많이 사용하였으나 최근 많은 빌드 도구들이 생겨나 Maven이 많이 쓰였고, 현재는 Gradle이 많이 쓰인다.
-
Ant는 스크립트 작성도 많고, 라이브러리 의존 관리가 되지 않아 불편하다.
2. 동일한 빌드 시스템 제공
3. 프로젝트 정보 제공
Ant 와의 차이점
- Ant는 비교적 자유도가 높은 편
(Ant : 전처리 / 컴파일 / 패키징 / 테스팅 / 배포 가능) - Maven은 정해진 라이프사이클에 의하여 작업 수행하며, 전반적인 프로젝트 관리 기능까지 포함.
(Build Tool + Project Management)
Gradle과의 차이점
- XML 대신 groovy 스크립트를 사용하여 동적인 빌드 가능.
- maven은 멀티프로젝트에서 상속 구조인데, gradle은 주입 방식이다. 멀티프로젝트에서 gradle이 더 적합하다.
플러그인
-
메이븐은 플러그인을 구동해주는 프레임워크(plugin execution framework)이다. 모든 작업은 플러그인에서 수행한다.
-
플러그인은 다른 산출물(artifacts)과 같이 저장소에서 관리된다.
-
메이븐은 여러 플러그인으로 구성되어 있으며, 각각의 플러그인은 하나 이상의 goal(명령, 작업)을 포함하고 있다. Goal은 Maven의 실행 단위이다.
-
플러그인과 골의 조합으로 실행한다. ex. mvn <plugin>:<goal> = mvn archetype:generate
-
메이븐은 여러 goal을 묶어서 lifecycle phases로 만들고 실행한다. ex. mvn <phase> = mvn instal
구분 Plugin 명 설명 core plugins clean, compiler ,deploy, install,verifier,resources,site 기본 단계에 핵심 플러그인 Packaging types/tools ear, ejb ,jar, rar, war, app-client 압축 도구 Reporting plugins changelog, changes, checkstyle, javadoc 리포팅 도구 플러그인 목록들
maven.apache.org/plugins/index.html
라이프사이클
- 메이븐은 프레임워크이기 때문에 동작 방식이 정해져 있고, 미리 정의하고 있는 빌드 순서가 있다. 이를 라이프사이클(Lifecycle)이라 한다.
- 메이븐은 프로젝트 생성에 필요한 단계(phases)들을 Build Lifecycle이라 정의하며
- default, clean, site 세 가지로 표준 정의한다.
- Lifecycle은 Build Phase 들로 구성되며 일련의 순서를 갖는다.
- phase는 실행 단위로서 goal과 바인딩된다.
clean : 빌드 시 생성되었던 산출물을 삭제
- pre-clean : clean 작업 전에 사전작업
- clean : 이전 빌드에서 생성된 모든 파일 삭제
- post-clean : 사후 작업
default : 프로젝트 배포 절차, 패키지 타입별로 다르게 정의됨
- validate : 프로젝트 상태 점검, 빌드에 필요한 정보 존재 유무 체크
- initialize : 빌드 상태를 초기화, 속성 설정, 작업 디렉터리 생성
- generate-sources : 컴파일에 필요한 소스 생성
- process-sources : 소스코드를 처리
- generate-resources : 패키지에 포함될 자원 생성
- compile : 프로젝트의 소스코드를 컴파일
- process-classes : 컴파일 후 후처리
- generate-test-source : 테스트를 위한 소스 코드를 생성
- process-test-source : 테스트 소스코드를 처리
- generate-test-resources : 테스팅을 위한 자원 생성
- process-test-resources : 테스트 대상 디렉터리에 자원을 복사하고 가공
- test-compile : 테스트 코드를 컴파일
- process-test-classes : 컴파일 후 후처리
- test : 단위 테스트 프레임워크를 이용해 테스트 수행
- prepare-package : 패키지 생성 전 사전작업
- package : 개발자가 선택한 war, jar 등의 패키징 수행
- pre-integration-test : 통합 테스팅 전 사전작업
- integration-test : 통합 테스트
- post-integration : 통합 테스팅 후 사후 작업
- verify : 패키지가 품질 기준에 적합한지 검사
- install : 패키지를 로컬 저장소에 설치
- deploy : 패키지를 원격 저장소에 배포
site : 프로젝트 문서화 절차
- pre-site : 사전작업
- site : 사이트 문서 생성
- post-site : 사후 작업 및 배포 전 사전작업
- site-deploy : 생성된 문서를 웹 서버에 배포
최종 빌드 순서는 compile - test - package이다.
- compile : src/main/java 디렉터리 아래의 모든 소스 코드가 컴파일된다.
- test : src/test/java, src/test/resources 테스트 자원 복사 및 테스트 소스 코드 컴파일된다.
- packaging : 컴파일과 테스트가 완료된 후, jar, war 같은 형태로 압축하는 작업.
의존성
- 개발자는 프로젝트에 사용할 라이브러리를 pom.xml에 dependency로 정의만 해두면
- 메이븐이 repository에서 검색해서 자동으로 추가해준다.
- 심지어 참조하고 있는 library까지 모두 찾아서 추가해준다. 이것을 '의존성 전이'라고 한다.
의존관계 제한 기능
불필요한 라이브러리 다운로드를 방지하기 위해 추가 기능을 제공한다.
- Dependency mediation : 버전이 다른 두 개의 라이브러리가 동시에 의존 관계에 있을 경우 Maven은 좀 더 가까운 의존관계에 있는 하나의 버전만을 선택
- Dependency management : 직접 참조하지는 않으면서 하위 모듈이 특정 모듈을 참조할 경우, 특정 모듈의 버전을 지정
- Dependency scope : 현재 Build 단계에 꼭 필요한 모듈만 참조할 수 있도록 참조 범위를 지정
- compile : 기본값, 모든 classpath에 추가, 컴파일 및 배포 때 같이 제공
- provided : 실행 시 외부에서 제공, 예를 들면 WAS에서 제공되어 지므로 컴파일 시에는 필요하지만, 배포 시에는 빠지는 라이브러리들
- runtime : 컴파일 시 참조되지 않고 실행 때 참조
- test : 테스트 때만
- system : 저장소에서 관리하지 않고 직접 관리하는 jar 파일을 지정
- import : 다른 pom파일 설정을 가져옴, <dependencyManagemet>에서만 사용
- Excluded dependencies : 임의의 모듈에서 참조하는 특정 하위 모듈을 명시적으로 제외처리
- Optional dependencies : 임의의 모듈에서 Optional로 참조된 모듈은 상위 모듈이 참조될 때 Optional 모듈은 참조 제외
의존 라이브러리의 경로
- 로컬 : USER_HOME/. m2/repository에 저장된다.
profile
- Maven은 서로 다른 환경에 따라 달라지는 설정을 각각 관리할 수 있는 Profile 기능을 제공한다.
POM.xml
- pom.xml 은 메이븐을 이용하는 프로젝트의 root에 존재하는 xml 파일
- pom은 프로젝트 객체 모델(Project Object Model)을 뜻한다.
- 프로젝트 당 1개가 있으며 것만 보면 프로젝트의 모든 설정, 의존성 등을 알 수 있다.
엘리먼트
-
<groupId> : 프로젝트의 패키지 명칭
-
<artifactId> : artifact 이름, groupId 내에서 유일해야 한다.
<groupId> org.springframework </groupId> <artifactId> spring-webmvc </artifactId> -
<version> : artifact의 현재 버전 ex. 1.0-SNAPSHOT
-
<name> : 애플리케이션 명칭
-
<packaging> : 패키징 유형(jar, war 등)
-
<distributionManagement> : artifact가 배포될 저장소 정보와 설정
-
<parent> : 프로젝트의 계층 정보
-
<dependencyManagement> : 의존성 처리에 대한 기본 설정 영역
-
<dependencies> : 의존성 정의 영역
-
<repositories> : 이거 안 쓰면 공식 maven 저장소를 활용하지만, 사용하면 거기 저장소를 사용
-
<build> : 빌드에 사용할 플러그인 목록을 나열
-
<reporting> : 리포팅에 사용할 플러그인 목록을 나열
-
<properties> : 보기 좋게 관리 가능, 보통 버전에 많이 쓴다.
출처: http://maven.apache.org/
출처: https://sjh836.tistory.com/131'JAVA > Java' 카테고리의 다른 글
자바 데이터 타입, 변수, 배열 (0) 2020.12.26 JAVA 연산자 (0) 2020.11.29 서블릿 Life Cycle 알아보기 (0) 2020.06.02 왜 Wrapper 클래스는 쓰이는 걸까? (1) 2020.05.21 객체의 해시코드(hashCode())란 (0) 2020.05.19 -