2. 진행 순서
• Maven의 이해
• Simple Weather Project 작성 실습
• Multi Module Project 작성 실습
3. What is Maven?
• 프로젝트의 생산성 향상
• 가시성 향상
• 프로젝트 관리 및 이해 도구
– Builds
– Documentation
– Reporting
– Dependencies
– SCMs
– Releases
– Distribution
4. Maven's Objectives
• 빌드 프로세스를 쉽게
• 균일한 빌드 시스템 제공
– POM(Project Object Model)과 플러그인 세트
• 양질의 프로젝트 정보 제공
– Change log, Cross ref. sources, Dependency
list, Unit test reports
• 개발을 위한 Best practice 가이드라인 제공
5. What is Maven Not?
• Maven is a site and documentation tool
• Maven extends Ant to let you download
dependencies
• Maven is a set of reusable Ant scriptlets
6. Ant 와의 비교
<project name="my-project" default="dist" basedir=".">
<description>
simple example build file
</description>
<!-- set global properties for this build -->
<property name="src" location="src/main/java"/>
<property name="build" location="target/classes"/>
<property name="dist" location="target"/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init"
description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
<javac srcdir="${src}" destdir="${build}"/>
</target>
<target name="dist" depends="compile"
description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file
-->
<jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar"
basedir="${build}"/>
</target>
<target name="clean"
description="clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.sonatype.mavenbook</groupId>
<artifactId>my-project</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
A simple Ant build.xml File
A simple Maven pom.xml File
7. Ant 와의 비교(계속)
• Apache Ant
– 공통적인 프로젝트 디렉토리 구조와 같은 공식
적인 관례가 없음. 소스 위치와 산출물 위치 지
정 필요.
– 절차적. “컴파일하고 복사하고 압축한다” 같은
지시를 해야 함.
– Goal과 goal의 디펜던시를 정의할 수 있는 라
이프사이클이 없음.
8. Ant 와의 비교 (계속)
• Apache Maven
– 관례를 가짐. 소스는 어디에 있는지, 바이트코
드는 target/classes, target에 jar 생성
– 선언적. Pom.xml 파일 생성 후 기본 디렉토리
에 소스를 위치하면 나머지는 maven이 알아서
함
– 라이프사이클을 가짐. mvn install을 실행하면
라이프사이클이 완료될 때 까지 연속적으로 단
계를 실행함.
9. First Maven Project
$ mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -
DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
$ cd my-app
$ mvn install
$ java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html
프로젝트 생성
프로젝트 빌드와 패키징
프로젝트 실행
10.
11.
12. CoC(Convention over
Configuration)
• 시스템, 라이브러리, 프레임워크는 별도의 설
정 없이 „바로 실행‟될 수 있어야 한다
• EJB의 복잡한 설정에 대항하여 Ruby on Rails,
EJB3등과 같이 „바로 실행‟원칙을 바탕으로
시작됨
• 개발자는 어플리케이션에서 관습적이지 않은
면만 정의할 필요가 있다
• 수많은 설정에서 개발자를 해방
• Ruby on Rails, Grails, Spring, JUnit, Jboss
Seam, CakePHP, …
13. Conceptual Model of a "Project"
• 의존성 관리
– 그룹 식별자, 산출물 식별자, 버전으로 구성된 중복되지 않
은 코디네이트들을 프로젝트에 적용
• 원격 저장소
– 의존성 관리와 관련한 메이븐 산출물들의 저장소
• 빌드 로직의 전역적인 재사용
– 플러그인 동작 시 외부 파일 참조하지 않음
• 툴에 대한 이식성과 통합
– 이클립스, 넷빈즈, IntelliJ 같은 툴의 프로젝트 정보 표준화
• 프로젝트 산출물의 쉬운 검색과 필터링
– 넥서스(Nexus)와 같은 툴은 POM안의 정보 저장소를 사용
하여 저장소의 내역들을 인덱스하고 검색을 허용함
15. POM
• POM Relationships
– 다른 프로젝트와의 의존성 정의. 코디네이트 정의. 부
모, 서브 모듈 정의.
• General project information
– 프로젝트 이름, URL, 조직, 개발자, 기여자, 라이선스
• Build settings
– Maven build 커스터마이징. 소스, 테스트 코드 위치 변
경. 플러그인 추가, 플러그인 goal을 라이프사이클에
지정
• Build environment
– Development, Production 등의 프로파일 정의
16. Super POM
• 모든 maven 프로젝트
는 묵시적으로 Super
POM을 상속 받음
– http://maven.apache.or
g/guides/introduction/in
troduction-to-the-
pom.html#Super_POM
근간이 되는 Super POM
17. Effective POM
• Super POM, 부모 POM과의 조합에 의해
실제로 동작하는 POM이 된다.
$ mvn help:effective-pom
18. Plugins and Goals
• Maven은 실제로 Maven
Plugin들의 핵심
framework 일 뿐이다
• Compile, jar 생성 등의 실
제 액션은 모두 plugin이
담당함
• Plugin은 하나 이상의
goal들의 집합임
• Goal은 작업의 단위
• $mvn pluginId:goalId
20. Maven Lifecycle(계속)
$ mvn resources:resources
compiler:compile
resources:testResources
compiler:testCompile
surefire:test
jar:jar
install:install
각 단계가 실행될 때 연결되는 goal
$ mvn install 과 동일한 결과
25. Maven 중앙 저장소 검색
• http://mvnrepository.com
• http://search.maven.org/
26. Maven의 의존성 관리
• pom.xml의 <dependencies> 에서 설정
• 의존성 전이(transitive dependency)
– 1. A -> B
– 2. B -> A 관계가 없다
– 3. B -> C
– A와 C는 직접적인 연관관계가 없지만 함수 종속이
발생하여 A -> C라는 의존성 전이가 성립
• 프로젝트에서 직접적으로 사용하는 라이브러
리의 의존성만 정의하면 나머지 의존성은
maven이 묵시적으로 추가함
27. Maven의 의존성 관리(계속)
$ mvn dependency:resolve
$ mvn dependency:tree
의존성 목록 확인
의존성 관계 구조 확인
$ mvn dependency:analyze
의존성 분석 : 바이트 코드 분석을 통해 의존성 문제 제시
- 사용되었지만 정의 되지 않은 의존성
- 사용되지 않았지만 정의된 의존성
29. 의존성 충돌 해결
• 다른 프로젝트의 의존성 전이를 제거
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.5.ga</version>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
의존성 전이 배제와 교체
30. 의존성 Scope
• compile
– 기본 스코프. 모든 상황에서 classpath에 추가되며 패키지에 포함된다.
• provided
– Compile시에는 classpath에 포함되지만. 패키지에 포함되지 않는다.
– Servlet API JAR 같은 경우
• runtime
– Runtime시에만 필요한 경우
– JDBC Driver 같은 경우
• test
– 테스트 컴파일과 실행 시 만 동작
• system
– 로컬 파일의 jar 경로 지정 필요
– 패키지에 포함되지 않는다
– 이 스코프는 권장되지 않는다. Public 혹은 커스텀 메이븐 저장소에서 디
펜던시를 참조하도록 노력하자.
32. 사이트 생성과 리포팅
• 프로젝트 문서와 리포트 생성
• target/site 디렉토리에 결과물 생성
• Site descriptor 수정을 통해 레이아웃을 정
의할 수 있음
– src/site/site.xml
• http://maven.apache.org/guides/mini/guide
-site.html
$ mvn site
$ mvn site:run
33. Archetype
• Maven 프로젝트 템플릿 툴킷
• “원래 모델이나 형태를 따르는 다른 유사한 것을 패
턴화한 것(프로토타입)”
• 간단한 스윙 어플리케이션에서 복잡한 웹 어플리케
이션에 이르기 까지 수많은 archetype을 활용할 수
있다.
• 표준 프레임워크와 의존 관계가 있는 라이브러리
• 프로젝트에 공통으로 필요한 설정 파일
• 표준 프레임워크 기반으로 작성한 샘플 소스
• 사내 저장소에 프로젝트 아키타입 생성 및 배포
$ mvn archetype:generate
36. Multi Module Project
• http://www.sonatype.com/books/mvnex-
book/reference/multimodule.html
simple-parent
simple-weather simple-webapp
Super POM 상속
모듈
37. Multi Module Enterprise Project
• http://www.sonatype.com/books/mvnex-
book/reference/multimodule-web-spring.html
38. Maven 활용 계획
• Cygnus modularity
– Sub project
– Library
– Project를 나누어 개발한 후 제품 패키징
• OSGi Bundle
– Maven을 통한 feature install
• 프로젝트 사이트 문서화
39. Challenges
• 빌드 프로파일
– http://www.sonatype.com/books/mvnref-book/reference/assemblies.html
– http://gt1000.tistory.com/entry/Maven-8%EC%9E%A5-
%EB%A9%94%EC%9D%B4%EB%B8%90-
%ED%94%84%EB%A1%9C%ED%8C%8C%EC%9D%BC-
%EB%B0%B0%ED%8F%AC
• Maven 어셈블리
– http://www.sonatype.com/books/mvnref-book/reference/assemblies.html
• POM 최적화 및 리팩토링
– http://www.sonatype.com/books/mvnex-book/reference/optimizing.html
• Maven 사내 저장소 설치 및 활용
– http://gt1000.tistory.com/entry/Maven-11%EC%9E%A5-
%EB%A9%94%EC%9D%B4%EB%B8%90-%EC%82%AC%EB%82%B4-
%EC%A0%80%EC%9E%A5%EC%86%8C-%EC%84%A4%EC%B9%98-
%EB%B0%8F-%ED%99%9C%EC%9A%A9
• Site 생성
– http://www.sonatype.com/books/mvnref-book/reference/site-generation.html
40. References
• Maven by Example
– http://www.sonatype.com/books/mvnex-
book/reference/
• Maven: The Complete Reference
– http://www.sonatype.com/books/mvnref-
book/reference/
• Developing with Eclipse and Maven
– http://www.sonatype.com/books/m2eclipse-
book/reference/
• 자바 세상의 빌드를 이끄는 메이븐
– http://gt1000.tistory.com/category/maven