tools & libs/빌드툴(maven,gradle)

[maven] maven 활용 메뉴얼 2

  • -
반응형

이번 포스트에서는 간단한 maven 프로젝트를 만들어보고 동작의 핵심인 pom.xml 파일에 대해 좀 더 살펴보자.

Simple Maven Project(vscode)

 

프로젝트 생성

명령 팔레트를 실행시키고 [>java: create Java Project...] 선택 후 project type으로 Maven을 선택한다.

project 타입 선택: Maven

다음으로 템플릿 처럼 미리 저장된 Archetype을 선택할 수 있는데 여기서는 No Archetype을 선택하자.

Archetype 선택: 여기서는 완전 새로 만들어보자.

다음 화면에서는 프로젝트를 구별하기 위한 group id를 입력하는데 이것의 활용이 IDE마다 조금씩 다르다. vscode에서는 group id를 기본 package 이름으로 사용한다. 여기서는 com.doding.mvntest 라고 해보자.

다음 artifact id는 프로젝트 이름이다. 

마지막으로 프로젝트를 저장할 경로를 선택해주면 끝이다.

 

더보기

참고로 eclipse 기반의 IDE에서는 다음의 절차로 프로젝트를 생성할 수 있다.

 

File > New > Maven Project로 maven 프로젝트를 만들어보자.

Next를 클릭해서 프로젝트를 설정하는데 여기서는 archetype을 생략하는 simple project를 생성한다.

다음으로 프로젝트의 정보를 입력한다.

group id는 회사 정보 정도로 생각하면 되고 artifact id는 프로젝트를 나타내는 이름이다. version은 그 프로젝트의 버전, packaging은 최종 결과물을 배포하는 형식으로 jar나 war 등을 선택할 수 있다.

 

 

프로젝트 분석

프로젝트가 완성되면 다소 복잡해 보이는 폴더 구조가 생성된다.

maven project의 기본 구조

maven 프로젝트가 잘 생성되면 프로젝트 root에 pom.xml  파일이 생성된다.

폴더 구조에서는 src 하위에 main과 test가 있는데 main에는 runtime에 필요한 파일들을 작성하고 test에서는 단위테스트를 위한 파일을 작성한다. main와 test 하위에는 각각 java와 resources 폴더가 있는데 java 파일은 java 폴더에 작성하고 xml이나 propertes 등 java 이외의 파일은 resources에 넣어주면 된다. 이 파일들은 나중에 모두 하나의 class path에서 참조가 가능해진다.

이처럼 maven project는 필요한 폴더 구조를 강제해서 플랫폼 간의 차이를 없게 만든다.

 

pom.xml

pom.xml에는 메이븐 기반 프로젝트의 정보가 담기는 파일로 project의 root에 존재한다.

주요 속성

다음은 pom.xml의 주요 속성들이다.

  • modelVersion : POM model의 버전으로 현재는 4.0.0으로 고정
  • parent : 상위 프로젝트에 대한 정보로 상위 프로젝트의 내용을 현재 프로젝트에서 상속해 사용
  • groupId : 프로젝트를 생성하는 회사(조직)의 아이디로 일반적으로 도메인 이름을 거꾸로 사용
  • artifactId : 프로젝트 이름 성격으로  groupId 내에서 유일해야 함
    • 일반적으로 group id와 artifact id를 연결해서 기본 패키지 이름 구성
    • 어떤 경우는 group id가 기본 패키지가 되고 artifact id는 빌드 파일의 이름이 됨
  • version : 프로젝트의 현재 버전으로 프로젝트 개발 중일 때는 SNAPSHOT을 접미사로 사용.
  • packaging : 배포 파일의 패키징 유형(jar, war)
  • name : 프로젝트, 프로젝트 이름
  • properties : pom.xml에서 사용할 속성 선언을 선언. 주로 라이브러리의 버전을 한 군데서 관리하기 위함
  • dependencies : 프로젝트와 의존 관계에 있는 라이브러리들을 관리

물론 이 외에도 많은 속성들이 있는데 전체 내용은 아래를 참조하자.

Maven – POM Reference (apache.org)

 

Maven – POM Reference

POM Reference Introduction What is the POM? Quick Overview The Basics Maven Coordinates POM Relationships Dependencies Dependency Version Requirement Specification Version Order Specification Version Order Testing Exclusions Inheritance The Super POM Depen

maven.apache.org

 

현재 기본적으로 생성된 pom.xml 파일은 아래와 같이 modelVersion, groupId, artifactId, version으로 구성되어 있다.

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.doding.mvntest</groupId>
    <artifactId>maventest</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

</project>

 

properties

properties는 값을 설정하는 역할을 하는데 properties에 선언된 하위 태그는 속성의 이름이 되고 태그의 값이 속성의 값이다. 문서의 다른 부분에서 이 속성을 참조할 때에는 ${속성명}을 사용한다.

예를 들어 다음의 설정은 프로젝트의 JDK 버전을 17로 설정한다.

<project>
  . . .
    <properties>
        <java.version>17</java.version>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <maven.compiler.target>${java.version}</maven.compiler.target>
    </properties>
</project>
eclipse 계열의 경우 프로젝트 또는 pom.xml 파일을 오른 클릭 해서 maven > update project 를 선택해 주자.

 

의존성 관리

dependencydependencies 하위 속성으로 프로젝트에서 의존하는 라이브러리에 대해 설정한다. 

 

lib 검색 및 적용

만약 프로젝트에서 lombok이라는 라이브러리를 사용한다고 해보자.

eclipse 계열은 먼저 ide에 설치가 필요하다. 아래 링크를 참조해서 lombok을 eclipse에 설치한다.
https://goodteacher.tistory.com/233

이제 필요한 일은 mvnrepository.com에 가서 lombok을 검색하는 일이다.

링크를 타고 들어가면 버전을 선택할 수 있고 다시 원하는 버전을 선택하고 들어가면 여러 가지 플랫폼(Maven, Gridle...)에서 사용할 수 있는 코드를 제공해 준다.

이 내용을 복사해서 pom.xml에 dependencies 태그를 만들고 하위 태그로 복사해 준다.

<dependencies>
  <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
  </dependency>
</dependencies>

 

그리고 저장을 누르는 순간 local repository에 다운로드 되는데 이때 기본 local repository의 위치[사용자폴더]/.m2/repository이다.

 

dependency

다음은 dependency 태그의 주요한 하위 태그들이다.

  • groupId
  • artifactId
  • version
  • scope

groupId, artifactId, version은 쉽게 이해할 수 있고 scope가 새로 나온 특성이다. scope는 아래의 값을 갖는다.

scope의 용도는 해당 의존성을 언제, 어떻게 클래스 패스에 넣어서 사용할 것인가를 결정하는 것이다.

  • compile: 기본 범위로 생략 시 적용되며 컴파일과 런타임에 모두 사용 가능하다.
  • provided: 컴파일과 테스트시에는 사용되지만 런타임에는 외부 환경에서 제공되는 것을 사용한다.  예를 들어 운전 연습을 할 때에는 연습용 차를 사용하지만 막상 시험 볼 때는 시험장의 차를 사용하는 케이스이다. 웹 프로그래밍을 하려면 Servlet API를 사용하는데 런타임에는 WAS(tomcat)가 이를 제공하기 때문에 packaging 과정에서 제외하려면 provided로 설정한다.
  • runtime: 컴파일 시에는 불필요하고 실행 시에만 필요한 경우로 런타임이나 테스트 시는 classpath에 포함되지만 컴파일 시에는 포함되지 않는다. JDBC 드라이버 등이 이에 해당한다.
  • test: 테스트 진행 시에만 사용되고 배포 시에는 제외되며 따라서 main 영역에서는 사용되지 않는다.
  • system: 로컬 시스템에 설치된 JAR 파일처럼 외부에서 제공되는 의존성을 참조하는 경우에 사용한다.

예를 들어 json 문자열을 만들기 위한 jackson-databind는 언제나 사용되기 때문에 <scope>가 생략된 compile이 적용된다.

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.2.2</version>
</dependency>

junit은 테스트에서만 필요하기 때문에 scope가 test로 설정된다. 이 경우는 src/test 영역에서만 사용 가능하고 src/main에서는 사용할 수 없다.

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>

 

plugin

 

maven을 이용해서 어떤 추가적인 동작을 수행하기 위해서 플러그인을 지원한다. 플러그인은 <dependencies> 아래에 <build> 내에 <plugins> 내부에 작성한다.

<build>
	<plugins>
		<plugin>
			...
		</plugin>
		<plugin>
			...
		</plugin>
	</plugins>
</build>

 

대표적인 플러그인들에 대해 살펴보자.

Maven – Available Plugins (apache.org)

 

Maven – Available Plugins

Available Plugins Maven is - at its heart - a plugin execution framework; all work is done by plugins. Looking for a specific goal to execute? This page lists the core plugins and others. There are the build and the reporting plugins: Build plugins will be

maven.apache.org

 

compiler plugin

properties에 jdk 버전을 설정했던 것과 유사한데 보다 상세한 설정들이 가능하다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.10.1</version>
    <configuration>
        <encoding>utf-8</encoding>
        <compilerArgument>-Xlint:all</compilerArgument>
        <showWarnings>true</showWarnings>
        <showDeprecation>true</showDeprecation>
    </configuration>
</plugin>

 

jar plugin

jar로 패키징 된 파일을 바로 실행하기 위해서 Manifest file을 생성해 주는 plugin으로 main 메서드가 있는 클래스를 바로 실행할 수 있다. (일부 버전은 Unknown error 가 발생하므로 테스트해 가며 사용할 것)

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.1.1</version>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.example.HelloMain</mainClass>
        </manifest>
      </archive>
    </configuration>
</plugin>

 

의존사항들을 포함한 jar 배포

pom.xml에 등록된 의존사항들을 포함해서 jar를 만들기 위해서는 maven-assembly-plugin을 사용하면 된다.

<plugin>
	<artifactId>maven-assembly-plugin</artifactId>
	<version>3.3.0</version>
	<configuration>
		<descriptorRefs>
			<descriptorRef>jar-with-dependencies</descriptorRef>
		</descriptorRefs>
		<archive>
			<manifest>
				<mainClass>com.andy.labgen.ui.LabGeneratorUi</mainClass>
			</manifest>
		</archive>
	</configuration>

	<executions>
		<execution>
			<id>make-assembly</id>
			<phase>package</phase>
			<goals>
				<goal>single</goal>
			</goals>
		</execution>
	</executions>
</plugin>

 

반응형

'tools & libs > 빌드툴(maven,gradle)' 카테고리의 다른 글

[maven] maven trouble shooting  (0) 2022.04.12
[maven] maven 활용 메뉴얼 3  (0) 2022.04.12
[maven] maven 활용 메뉴얼 1  (0) 2022.04.11
[maven]서버에 배포하기  (0) 2021.08.22
[gradle]build.gradle  (0) 2021.01.30
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.