- [Maven] 기본 개념 & 사용법(작성중..)2024년 04월 21일 17시 43분 20초에 업로드 된 글입니다.작성자: nickhealthy
Maven이란?
Maven이란 프로젝트 관리를 위한 빌드 툴로서 프로젝트 생성, 라이브러리 설정, 컴파일, 테스트, 패키징 등 실제 프로젝트 관리 작업을 다룬다.
메이븐은 다음과 같은 항목으로 구성되어 있다.
- 의존성 관리, 디렉터리 레이아웃, 빌드 워크플로 등을 처리하는 규칙의 집합: 이러한 규칙을 표준화하면 개발 과정을 크게 간소화할 수 있다. 예를 들어, 공통 디렉터리 레이아웃을 이용하면 개발자가 익숙하지 않은 프로젝트에 빠르게 적응할 수 있다.
- 프로젝트 구성을 위한 XML 스키마(POM, Project Object Model): 모든 메이븐 프로젝트에는 메이븐이 프로젝트를 관리하는 데 필요한 모든 구성 정보를 포함하는 POM 파일이 들어있다.
- 프로젝트 실행을 외부 컴포넌트로 위임하는 플러그인 아키텍처: 이를 통해 메이븐의 기능을 간편하게 업데이트하고 확장할 수 있다.
Maven 설치하기
메이븐 설치 - 각자 OS에 맞는 파일을 다운로드 받으면 된다.
- (해당 과정 생략) 메이븐 명령어를 OS 터미널에서 자유롭게 사용하기 위해 환경변수를 설정한다.
Maven으로 자바 프로젝트 생성하기
Maven 프로젝트는 다른 사람이 만든 프로젝트(템플릿)를 가져와서 작업을 시작할 수 있다.
Maven를 사용해서 자바 프로젝트를 생성해보자. 우선 아래와 같이 명령어를 입력해본다.
mvn archetype:generate -DgroupId=com.nickhealthy -DartifactId=javaprj -DarchetypeArtifactId=maven-archetype-quickstart
명령어에 대한 설명
archetype:generate
: archetype을 생성하라는 옵션-DarchetypeArtifactId=maven-archetype-quickstart
- 다른 사람이 만든
maven-archetype-quickstart
라는 프로젝트 구조를 기본으로 한다. - 즉, 기존에 만든 프로젝트 구조를 템플릿으로 사용할 수 있다.
- 다른 사람이 만든
-DartifactId=javaprj
:javaprj
라는 이름의 새로운 프로젝트를 생성한다.-DgroupId=com.nickhealthy
- 프로젝트 이름은 겹칠 수도 있으니 보통 관례적으로 자신만의 도메인 이름을 뒤집어서 입력하게 된다.
- OS 파일시스템 개념에서 `DgroupId`는 폴더라고 생각하면 되고,
- `artifactId`는 파일명이라고 생각해도 무방할 것 같다.
- 프로젝트 이름은 겹칠 수도 있으니 보통 관례적으로 자신만의 도메인 이름을 뒤집어서 입력하게 된다.
프로젝트가 생성된 이후 아래와 같은 정보를 확인할 수 있다.
프로젝트 생성 후 pom.xml 파일 정보
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.nickhealthy</groupId> <artifactId>javaprj</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>javaprj</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
Maven으로 컴파일/패키징 후 실행하기
Maven 프로젝트는(
pom.xml
) 항상 프로젝트 루트 폴더에 존재하게 되는데 해당 경로에서 Maven 명령과 작업을 해야한다.Maven으로 컴파일하기
JDK를 이용해 자바 프로젝트를 컴파일 할 수도 있지만, Maven이 빌드 툴이며 빌드를 편리하게 해주기 때문에 Maven으로 컴파일을 진행한다.
다음과 같이 소스코드를 수정하고 Maven으로 컴파일을 다시 실행해보자
package com.nickhealthy; /** * Hello world! */ public class App { public static void main(String[] args) { // System.out.println("Hello World!"); System.out.println("Hello Maven!"); } }
아래 명령어를 실행하면 해당 프로젝트가 빌드된다.
mvn compile
정상적으로 빌드가 완료되면 해당 프로젝트의 루트 폴더에서 `target` 폴더 아래에 컴파일 된 `*.class` 파일이 생성된다.
자바 버전에 따른 오류가 생길 때
자바 버전에 따라 컴파일 에러가 발생할 수 있다.우리가 만든 `maven-archetype-quickstart` 템플릿 버전에서 JDK 1.5ver를 사용하고 있기 때문에 현재 프로젝트에서 사용하는 JDK와 Maven에서 사용하는 JDK 버전이 다르면 문제가 발생하는 것이다. 에러 메시지는 친절하게 어떤 부분이 문제인지 알려준다. 자바 버전이 문제일 경우 아래와 같이 해결하면 된다.
<properties>
태그 추가<maven.compiler.source>
: 소스파일을 자바의 특정 버전 이상 사용<maven.compiler.target>
: 특정 버전 이상으로 대상 컴파일
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.nickhealthy</groupId> <artifactId>javaprj</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>javaprj</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> </project>
Maven으로 패키징하기
아래 명령어를 입력하게 되면 프로젝트를 패키징하여 `*.jar` 파일로 만들 수 있다.
mvn package
정상적으로 패키징이 완료되면 해당 프로젝트의 루트 폴더에서 하위에
target/*.jar
파일이 생성된다.이제 패키징 된 `*.jar` 파일을 실행 시켜보자. 아래의 명령어는 다음과 같다.
- -cp(classpath): 다른 경로에 `*.class/*.jar` 파일이 존재할 때 클래스패스를 지정해주어야 JAVA 프로그램이 해당 클래스를 인식할 수 있다.
- com.nickhealthy.App: 패키지명이 존재할 경우 풀패키지명으로 작성해야 해당 클래스를 실행할 수 있다.
Build LifeCycle과 Phase들
Maven의 명령어와 빌드 단계에 대해 알아본다.
Maven 각각의 명령어를 '단계'라고 부른다. (아래 사진 참고)
- 빌드 라이프사이클은 여러 단계로 구성될 수 있다. 아래 명령어 이외에도 여러 명령어가 있다.
- 또한 단계별로 단계에 해당하는 프로그램들이 존재하며, 해당 프로그램들을 '플러그인'이라 부른다.
- 해당 플러그인들은 단계 별로 매핑해야 한다. 설정하지 않는다면 기본 설정을 따르게 된다.
- 꼭 Maven 플러그인이 아닌 외부에서 가져온 플러그인도 설정 가능하다.
- 플러그인(프로그램)에 내부적으로 'Goal'이라는 기능이 있다.
- 'Goal'은 플러그인이 가지고 있는 하위 프로그램이라고 생각하면 된다.
- 'Goal'은 실질적인 플러그인의 역할을 수행한다.
Maven 단계(명령어) 종류
단계별 플러그인(프로그램)
아래와 같이 빌드는 여러 단계로 구성될 수 있으며, 각 단계마다 플러그인이 존재하고, 'Goal'이 존재하게 된다.
플러그인을 따로 설정하지 않으면 단계에 기본 설정된 플러그인을 사용하게 된다.
컴파일러 플러그인과 JDK 버전 변경
현재 컴파일을 수행하고 있는 플러그인이 JDK 버전을 결정하고 있는데, JDK 버전을 직접 설정하면서 플러그인을 설정하는 방법을 알아보자. (플러그인이 가지고 있는 속성을 통해서 컴파일 옵션을 변경)
단계별 실행을 담당하는 플러그인들
- 각각의 단계들은 플러그인들과 연계되어 있다. 기본적으로 플러그인이 설정되어 있는 것도 있고, 설정되어 있지 않은 것도 있다.
- 단계마다 같은 플러그인을 사용할 수도 있다. 다만 같은 플러그인이더라도 Goal이 다르다. 즉, 최종적으로 수행해야하는 역할은 다른셈이다.
- 위의 사진을 보면 `compile`, `test-complie` 두 개의 다른 단계가 존재하지만 같은 플러그인을 사용하게 된다. 하지만 Goal은 서로 다른 Goal를 명시하고 있다.
실습 - Maven 컴파일러 플러그인 변경(JDK 버전 변경)
- `<properties>` 태그를 주석처리하면 JDK 버전이 1.5 버전으로 돌아가는 것을 볼 수 있다.
- 이전에 Maven 프로젝트를 만들 때 `maven-archetype-quickstart` 템플릿을 이용해 만들었는데 이 템플릿에 설정된 JDK 버전이다.
- 즉, 아무것도 명시해주지 않았을 때 `maven-archetype-quickstart` 설정된 것을 그대로 사용하게 되는 것이다.
- 다음과 같이 `<build>` 태그에 컴파일 버전을 명시하면 해당 버전으로 오버라이딩하여 사용하게 된다.
- Maven의 기본 설정된 플러그인 또는 템플릿에 설정된 버전을 오버라이딩하여 변경함
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.nickhealthy</groupId> <artifactId>javaprj</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>javaprj</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <!-- <properties>--> <!-- <maven.compiler.source>1.8</maven.compiler.source>--> <!-- <maven.compiler.target>1.8</maven.compiler.target>--> <!-- </properties>--> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
참고 - `maven-compllier-plugin`
3.6 버전부터 이상은 `<build>` 태그에 있는 것처럼 플러그인을 수정하지(오버라이딩) 않아도 되고,
기존에 사용했던 대로 `<properties>` 태그에 컴파일 버전을 명시해줄 수도 있다.다음글이 없습니다.이전글이 없습니다.댓글