POM 살펴보기
프로젝트 설명
- 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>