전편
☞ 2022.08.22 - [Data Engineering/Maven] - Maven 뽀개기 3 - POM
메이븐의 핵심은 POM이라 할 수 있다. POM은 프로젝트의 베이스 디렉토리에 있는 XML 파일(pom.xml)이다. POM 파일에 우리가 원하는 컨피겨레이션과 프로젝트에 대한 정보를 형식에 맞게 적어 놓으면 메이븐이 빌드할 때 파일을 읽는다. POM의 특징 중 하나는 default POM(Super POM)이 있어 자동으로 상속한다는 것이다. 그래서 컨피겨레이션을 하나하나 다 적지 않아도 된다.
1. POM의 기본형식
groupID, artifactID, version은 필수적인 항목이다. 프로젝트가 레포지토리에 저장될 때 groupID:artifactID:version과 같은 형식으로 기록된다.
<project ....>
<modelVersion>4.0.0</modelVersion>
<groupID>그룹아이디</groupID>
<artifactID>프로젝트 ID</artifactID>
<version>프로젝트 버전</version>
<properties>
속성 정보
</properties>
<dependencies>
의존 라이브러리 정보
</dependencies>
</project>
2. Effective POM (Super POM)
아래는 Effective POM 코드이다. 따로 오버라이드 하지 않으면 해당 파일의 속성이 적용된다. 매우 길어서 접어놨는데 코드를 살펴보면 레포지토리에 대한 정보(<repositories>...</repositories>), 소스 디렉토리에 대한 정보(<sourceDirectory>...</sourceDirectory>) 등 빌드에 필요한 모든 정보가 있음을 알 수 있다.
<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>
<groupId>com.companyname.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
</pluginRepository>
</pluginRepositories>
<build>
<sourceDirectory>C:\MVN\src\main\java</sourceDirectory>
<scriptSourceDirectory>C:\MVN\src\main\scripts</scriptSourceDirectory>
<testSourceDirectory>C:\MVN\src\test\java</testSourceDirectory>
<outputDirectory>C:\MVN\target\classes</outputDirectory>
<testOutputDirectory>C:\MVN\target\test-classes</testOutputDirectory>
<resources>
<resource>
<directory>C:\MVN\src\main\resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>C:\MVN\src\test\resources</directory>
</testResource>
</testResources>
<directory>C:\MVN\target</directory>
<finalName>project-1.0</finalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>default-clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>default-testResources</id>
<phase>process-test-resources</phase>
<goals>
<goal>testResources</goal>
</goals>
</execution>
<execution>
<id>default-resources</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>default-jar</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<executions>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<executions>
<execution>
<id>default-test</id>
<phase>test</phase>
<goals>
<goal>test</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>default-install</id>
<phase>install</phase>
<goals>
<goal>install</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>default-deploy</id>
<phase>deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.3</version>
<executions>
<execution>
<id>default-site</id>
<phase>site</phase>
<goals>
<goal>site</goal>
</goals>
<configuration>
<outputDirectory>C:\MVN\target\site</outputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</reportPlugin>
</reportPlugins>
</configuration>
</execution>
<execution>
<id>default-deploy</id>
<phase>site-deploy</phase>
<goals>
<goal>deploy</goal>
</goals>
<configuration>
<outputDirectory>C:\MVN\target\site</outputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</reportPlugin>
</reportPlugins>
</configuration>
</execution>
</executions>
<configuration>
<outputDirectory>C:\MVN\target\site</outputDirectory>
<reportPlugins>
<reportPlugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
</reportPlugin>
</reportPlugins>
</configuration>
</plugin>
</plugins>
</build>
<reporting>
<outputDirectory>C:\MVN\target\site</outputDirectory>
</reporting>
</project>
3. 디펜던시 작성법
아마 제일 많은 수작업을 요구로 하는 부분이 디펜던시 작성일 것이다. 디펜던시 작성은 아래 예제 같은 형식을 따라야 한다. <dependency>...</dependency> 안에 원하는 라이브러리의 groupID, artifactID, version을 명시해야 한다. scope은 해당 디펜던시가 어떤 상황에서 필요한지 기술하는 것인데 아래에 있는 test 포함해서 다양한 옵션이 있다. 하지만 scope은 필요한 경우가 아니면 명시하지 않아도 된다.
<!-- JUnit 라이브러리 추가 예제 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
다음편
☞ 2022.08.23 - [Data Engineering/Maven] - Maven 뽀개기 4 - Maven Goals, Maven Plugins
'Data Engineering > 메이븐' 카테고리의 다른 글
Maven 뽀개기 4 - Maven Goals, Maven Plugins (0) | 2022.08.27 |
---|---|
Maven 뽀개기 2 - 간단한 실습 (0) | 2022.08.24 |
Maven 뽀개기 1 - Maven이란? Maven 설치 (0) | 2022.08.23 |
댓글