Maven

빌드란?

- 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정 또는 그에 대한 결과물이다.

- 즉, 작성한 소스코드(. java), 프로젝트에서 쓰인 각각의 파일 및 자원(.xml, .jpg, .jar, .properties 등)을 JVM이나 tomcat 같은 WAS가 인식할 수 있는 구조로 패키징 하는 과정 및 결과물

 

+ 빌드 도구(Build Tool)

- 빌드 도구란 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램

- 빠른 기간 동안 계속해서 늘어나는 라이브러리 추가, 프로젝트를 진행하며 라이브러리의 버전 동기화의 어려움을 해소하고자 등장

- 초기의 java 빌드 도구로 Ant를 많이 사용하였으나 최근 많은 빌드 도구들이 생겨나 Maven이 많이 쓰였고, 최근에는 Gradle이 많이 쓰인다.

 

Maven

Maven이란?

- Maven은 자바용 프로젝트 관리도구로 Apache Ant의 대안으로 만들어졌다.

- Maven은 Ant와 마찬가지로 프로젝트의 전체적인 라이프 사이클을 관리하는 도구이며, 많은 편리함과 이점이 있어 널리 사용되고 있다.

- Maven은 필요한 라이브러리를 특정 문서(pom.xml)에 정의해 놓으면 내가 사용할 라이브러리뿐만 아니라 해당 라이브러리가 작동하는 데에 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해서 자동으로 다운로드하여 준다.

- Maven은 중앙 저장소를 통한 자동 의존성 관리를 Apache 재단에서 운영하는 중앙 저장소 또는 개별의 중앙 저장소에서 할 수 있으며 이는 라이브러리를 공유하는 파일 서버라고 볼 수 있다.

- 간단한 설정을 통한 배포 관리가 가능하다.

 

+ Ant vs Maven

- Ant : 비교적 자유도가 높다.(전처리/컴파일/패키징/테스팅/배포 가능)

- Maven : 정해진 라이프사이클에 의하여 작업 수행하며, 전반적인 프로젝트 관리 기능 포함(Build Tool + Project Management)

 

Maven의 LifeCycle

1. Life Cycle이란

- 미리 정해진 빌드 순서

- Maven은 프레임워크이기 때문에 동작 방식이 정해져있고, 미리 정의하고 있는 빌드 순서가 있다. 이른 Life Cycle이라 한다.

Default(Build) 일반적인 빌드 프로세스를 위한 모델
Clean 빌드 시 생성되었던 파일들을 삭제
Validate 프로젝트가 올바른지 확인하고 필요한 모든 정보를 사용할 수 있는지 확인
Compile 프로젝트의 소스코드를 컴파일
Test 유닛 테스트를 수행(테스트 실패시 빌드 실패로 처리 + 생략 가능)
Package 실제 컴파일된 소스 코드와 리소스들을 jar, war 등의 파일로 패키징
Verify 통합 테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는 지 확인
Install 패키지를 로컬 저장소에 설치
Site 프로젝트 문서와 사이트 작성 및 생성
Deploy 만들어진 Package를 원격 저장소에 release

2. 빌드 순서

- compile -> test -> package

- compile : src/main/java 디렉토리 아래의 모든 소스 코드 컴파일

- test : src/test/java, src/test/resources 테스트 자원 복사 및 테스트 소스 코드 컴파일

        ※ junit : 단위 테스트 프레임워크. 테스트 단계를 거치기 위해 의존 설정을 해준다.

- package : compile과 test가 완료된 후 jar, war 같은 형태로 압축

3. Phase(단계)

- Build LifeCycle의 논리적 빌드 단계

- Phase는 의존 관계를 가져 해당 Phase가 수행되기 위해서는 이전의 Phase가 선행해야 한다.

- 각 Phase에는 연결된 plug-in이 존재

- Dependency : 모든 Phase는 이전 단계가 성공적으로 실행되었을 때 실행된다.

4. Goal

- 특정 작업, 최소한의 실행 단위(task)

- 하나의 plug-in에서는 여러 작업을 수행할 수 있도록 지원하며, plug-in에서 실행할 수 있는 각각의 기능을 Goal이라 한다.

- 플러그인의 goal을 실행하는 방법

    -> mvn groupId:artifactId:version:goal

    -> mvn plugin:goal

5. Maven 설정 파일

  1. settings.xml

    - Maven Build Tool과 관련한 설정 파일

    - MAVEN_HOME/conf 디렉터리에 위치(maven 설치 시 기본 제공)

    + maven을 빌드할 때 의존 관계에 있는 라이브러리, 플러그인을 중앙 저장소에서 개발자 PC로 다운로드하는 위치(로컬 저장소)의 기본

       설정 'USER_HOME/.m2/repository'를 settings.xml을 통해 원하는 로컬 저장소의 경로로 지정, 변경할 수 있다.

  2. POM(Project Object Model -  프로젝트 객체 모델)

    - POM은 pom.xml 파일을 의미하며, maven을 이용하는 프로젝트의 root에 존재하는 xml 파일이다.

    - Maven의 기능을 이용하기 위해 POM이 사용된다.

    - 파일은 프로젝트마다 1개이며, pom.xml을 통해 프로젝트의 모든 설정, 의존성 등을 알 수 있다.

    - pom.xml의 이름을 수정할 수 있으나 그대로 사용하는 것이 권장된다.

    + pom.xml 예제 (SpringBoot 프로젝트 생성 시 기본적으로 제공되는 pom.xml 파일)

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion> <!--POM model의 버전-->
	<parent> <!--프로젝트의 계층 정보-->
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.god</groupId> <!--프로젝트를 생성하는 조직의 고유 아이디를 결정한다. 일반적으로 도메인 이름을 거꾸로 적는다.-->
	<artifactId>bo</artifactId> <!--프로젝트 빌드시 파일 대표이름 이다. groupId 내에서 유일해야 한다.Maven을 이용하여 빌드시 다음과 같은 규칙으로 파일이 생성 된다.
		artifactid-version.packaging. 위 예의 경우 빌드할 경우 bo-0.0.1-SNAPSHOT.war 파일이 생성된다.-->
	<version>0.0.1-SNAPSHOT</version> <!--프로젝트의 현재 버전, 프로젝트 개발 중일 때는 SNAPSHOT을 접미사로 사용-->
	<packaging>war</packaging> <!--패키징 유형(jar, war, ear 등)-->
	<name>bo</name> <!--프로젝트, 프로젝트 이름-->
	<description>Demo project for Spring Boot</description> <!--프로젝트에 대한 간략한 설명-->
	<url>http://goddaehee.tistory.com</url> <!--프로젝트에 대한 참고 Reference 사이트-->

	<properties>
	<!-- 버전관리시 용이 하다. ex) 해당 자바 버전을 선언 하고 dependencies에서 다음과 같이 활용 가능 하다.
	<version>${java.version}</version> -->
		<java.version>1.8</java.version>
	</properties>

	<dependencies> <!--dependencies 태그 안에는 프로젝트와 의존 관계에 있는 라이브러리들을 관리 한다.-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<build> <!--빌드에 사용할 플러그인 목록-->
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

 

출처 {

    https://goddaehee.tistory.com/199   

    https://velog.io/@changyeonyoo/Maven-%EC%9D%B4%EB%9E%80

 

[Maven] Maven 이란? (정의, 예제)

[Maven] 메이븐 이란? (정의, 예제) 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ 메이븐 알아보기 ] 입니다. : ) 1. 빌드 (Build) #1 빌드란?  - 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립

goddaehee.tistory.com

}

'Programming > Java' 카테고리의 다른 글

Spring 개념과 express.js와의 차이  (0) 2023.01.24
[JAVA] Gradle  (0) 2022.07.19
[JAVA] 람다식  (0) 2022.04.18
[JAVA] 제네릭  (0) 2022.04.11
[JAVA] I/O  (0) 2022.04.05

댓글