by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

POM 살펴보기




POM 살펴보기

  • http://maven.apache.org/pom.html
  • Maven에서는 하나의 프로젝트에서 하나의POM(Project Object Model)을 가진다.
  • POM은 프로젝트의 구조와 내용에 대해 설명하고 있으며 pom.xml 파일로 관리된다.

프로젝트 설명

  • modelVersion : POM model 버전
  • groupId : 일종의 네임스페이스로, 자바 패키지 이름과 동일한 명명 규약을 갖는다. 상위 프로젝트나 조직의 패키지 명을 사용한다
  • artifactId : 해당 프로젝트의 고유 아이디를 입력한다.
  • packaging : 빌드 결과의 패키징을 결정한다. 대부분이 JAR이며, 그 외에도 WAR, EAR, POM, bundle (OSGi) 등이 있다.
  • version : 버전은 SNAPSHOT과 릴리즈로 구분되며. 릴리즈냐 아니냐에 따라 배포 위치가 달라지게 된다.
  • name : 프로젝트 이름
  • url : 프로젝트 사이트 URL
  <modelVersion>4.0.0</modelVersion>
  <groupId>net.gurubee.web</groupId>
  <artifactId>springmvc-project</artifactId>
  <packaging>jar</packaging>
  <version> 0.0.1-SNAPSHOT</version>
  <name>Spring MVC Sample Project</name>
  <url>http://wiki.gurubee.net/</url> 

Properties 설정

  • Maven Properties 참고
  • pom.xml 파일에서 maven 프로퍼티를 사용하여 동적인 환경 구성이 가능하다.
  • Maven Project Object Model(pom.xml) 에 정의된 Maven Project Properties 사용이 가능하다.
    ex) ${project.build.outputDirectory}   
  • 시스템 환경 변수 값을 참조 하여 사용 할 수도 있다.
     env.JAVA_HOME → ${env.JAVA_HOME}   
  • System.getProperty() 메소드에서 제공하는 Java System Properties도 사용 할 수 있다.
     ${java.version} 
  • 위 예제는 사용자 정의(User-defined) Properties를 선언한 예제이다.
<properties>
    <env>local</env>  
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring-core-version>3.0.5.RELEASE</spring-core-version>
    <spring-batch-version>2.1.1.RELEASE</spring-batch-version>
</properties>

Profile 설정

  • Profile 참고
  • Profile의 사용 목적은 서로 다른 빌드 환경간의 이식성 이다.
  • 실행시 profile 옵션을 사용한다. 마이너스 대문자 P (ex. mvn compile -Prelease)
  • 실행위치의 pom.xml, 실행위치의 profiles.xml, $USER_HOME/settings.xml, $M2_HOME/conf/settings.xml 순으로 profile 항목을 찾는다.
  • profile의 id 가 동일한 경우가 나타나면 해당 profile 에서 선언된 내용을 적용한다.
  • 즉 사용자 정의 환경변수 env 의 값이 release 로 변경 됨.
   <profiles>
        <profile>
            <id>local</id>
            <properties>
                <env>local</env>
            </properties>            
        </profile>
        <profile>
            <id>release</id>
            <properties>
                <env>release</env>
            </properties>
            <dependencies>
                <dependency>
                    <groupId>javax.servlet.jsp</groupId>
                    <artifactId>jsp-api</artifactId>
                    <version>2.1</version>
                    <scope>provided</scope>
                </dependency>
                <dependency>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                    <version>2.5</version>
                    <scope>provided</scope>
                </dependency>
            </dependencies>
        </profile>    
    </profiles>

Repository 설정

  • Repository는 artifact들의 저장소로 로컬 및 리모트 repository로 구성되며 pom.xml에서 선언된 dependency들을 자동으로 다운로드 한다.
  • Maven은 아무런 설정을 하지 않아도 공식 Maven repository에서 artifact들을 다운로드해 $USER_HOME/.m2/repository에 저장한다.
  • 공식 Maven Repository외에 다른 Repository를 위와 같이 POM에 추가하여 artifact들을 다운로드 할 수 있다.
  • http://search.maven.org
<repositories>
    <repository>
        <id>maven2-repository.dev.java.net</id>
        <name>Java.net Repository for Maven</name>
        <url>http://download.java.net/maven/2/</url>
        <layout>default</layout>
    </repository>
</repositories>

의존성(Dependency) 관리

  • 기존의 빌드 툴들이 로컬 파일 시스템에 개발자가 직접 복사해 넣은 라이브러리를 그대로 사용하지만, Maven은 자동화된 의존성 관리라는 새로운 개념이 도입 되었다.
  • dependency로 설정된 artifact들은 선언된 repository에서 다운로드를 받는다.
  • 기본 저장 경로는 $USER_HOME/.m2/repository 이다.
  • dependency의 scope
    • compile : 디폴트 scope. 컴파일시에도 사용되며, 배포시에도 함께 배포되어야 하는 artifact이다.
    • runtime : 컴파일시에는 사용되지 않고, 런타임시에 사용된다.
    • provided : 컴파일과 유사하나 패키지에는 포함되지 않는다. servlet.jar의 경우 Servlet 컨테이너에 의하여 제공되기 때문에 이 scope를 사용한다.
    • test : 테스트를 위해서만 사용
    • system : 개발자가 직접 jar 파일로 제공하는 라이브러리. 따라서 이 scope의 jar 파일은 repository에서 관리되지 않는다
<dependencies>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring-core-version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>${spring-core-version}</version>
    </dependency>
    <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-all</artifactId>
       <version>1.7</version>
       <scope>test</scope>
     </dependency>
  </dependencies>

Build 관리

  • 빌드 및 배포 관련된 설정을 한다.
  • filters : 필터 파일 지정, resources에서 지정한 resource 파일에 대해서 필터(치환) 작업을 할 수 있다.
  • resources : 리소스파일 디렉토리 지정
  • plugins : 빌드시에 사용할 플러그인 목록을 나열하고, 각 플러그인에 대한 옵션을 지정할 수 있다
  • 아래 예제는 빌드한 결과를 maven-war-plugin 을 이용하여 배포한다.
   <build>
        <finalName>${project.artifactId}-${project.version}</finalName>       
        <filters>
            <filter>${project.basedir}/filter/build-${env}.filter</filter>
        </filters>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <includes>
                    <include>**/*</include>
                </includes>
                <filtering>true</filtering>
            </resource>         
        </resources>        
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
                <includes>
                    <include>**/*</include>
                </includes>
                <filtering>true</filtering>
            </testResource>
        </testResources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <debug>true</debug>
                    <optimize>true</optimize>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <showDeprecations>true</showDeprecations>
                </configuration>
            </plugin>
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-resources-plugin</artifactId>
               <configuration>
                   <encoding>UTF-8</encoding>
               </configuration>
            </plugin>
            <!-- compile war:exploded -Preal  -->           
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <warSourceDirectory>webapps</warSourceDirectory>
                    <webappDirectory>${deploy-path}</webappDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>  

Reporting 관리

  • 다양한 리포팅 플러그인을 지정 할 수 있다.
<reporting>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-report-plugin</artifactId>
    </plugin>
    <!-- pmd -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-pmd-plugin</artifactId>
      <version>2.4</version>
      <configuration>
        <rulesets>
          <ruleset>${project.basedir}/build/pmd/Ruleset.xml</ruleset>
        </rulesets>
        <sourceEncoding>${src.encoding}</sourceEncoding>
      </configuration>
    </plugin>
    <!-- JDepend -->
    <plugin>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>jdepend-maven-plugin</artifactId>
    </plugin>
  </plugins>
</reporting>

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.