- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26740446&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
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>
문서정보
- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26740446&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.