본문 바로가기
Data Engineering/메이븐

Maven 뽀개기 3 - POM

by 무언가 하는 소소 2022. 8. 26.
728x90
반응형

 

 

전편

☞ 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

 

Maven 뽀개기 4 - Maven Goals, Maven Plugins

전편 링크 2022.08.22 - [Data Engineering/Maven] - Maven 뽀개기 3 - POM 1. Maven Goals 메이븐을 보다보면 계속 골골 거리는데 처음에는 페이즈, 플러그인과 헷갈렸다. 메이븐에서 골이란 처리해야할 태스크를..

dogfootja.tistory.com

728x90
반응형

댓글