SlideShare a Scribd company logo
1 of 40
Maven의 이해
박성재(http://blue-
hatch.blogspot.kr/)
진행 순서
• Maven의 이해
• Simple Weather Project 작성 실습
• Multi Module Project 작성 실습
What is Maven?
• 프로젝트의 생산성 향상
• 가시성 향상
• 프로젝트 관리 및 이해 도구
– Builds
– Documentation
– Reporting
– Dependencies
– SCMs
– Releases
– Distribution
Maven's Objectives
• 빌드 프로세스를 쉽게
• 균일한 빌드 시스템 제공
– POM(Project Object Model)과 플러그인 세트
• 양질의 프로젝트 정보 제공
– Change log, Cross ref. sources, Dependency
list, Unit test reports
• 개발을 위한 Best practice 가이드라인 제공
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
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
Ant 와의 비교(계속)
• Apache Ant
– 공통적인 프로젝트 디렉토리 구조와 같은 공식
적인 관례가 없음. 소스 위치와 산출물 위치 지
정 필요.
– 절차적. “컴파일하고 복사하고 압축한다” 같은
지시를 해야 함.
– Goal과 goal의 디펜던시를 정의할 수 있는 라
이프사이클이 없음.
Ant 와의 비교 (계속)
• Apache Maven
– 관례를 가짐. 소스는 어디에 있는지, 바이트코
드는 target/classes, target에 jar 생성
– 선언적. Pom.xml 파일 생성 후 기본 디렉토리
에 소스를 위치하면 나머지는 maven이 알아서
함
– 라이프사이클을 가짐. mvn install을 실행하면
라이프사이클이 완료될 때 까지 연속적으로 단
계를 실행함.
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
프로젝트 생성
프로젝트 빌드와 패키징
프로젝트 실행
Maven의 이해
Maven의 이해
CoC(Convention over
Configuration)
• 시스템, 라이브러리, 프레임워크는 별도의 설
정 없이 „바로 실행‟될 수 있어야 한다
• EJB의 복잡한 설정에 대항하여 Ruby on Rails,
EJB3등과 같이 „바로 실행‟원칙을 바탕으로
시작됨
• 개발자는 어플리케이션에서 관습적이지 않은
면만 정의할 필요가 있다
• 수많은 설정에서 개발자를 해방
• Ruby on Rails, Grails, Spring, JUnit, Jboss
Seam, CakePHP, …
Conceptual Model of a "Project"
• 의존성 관리
– 그룹 식별자, 산출물 식별자, 버전으로 구성된 중복되지 않
은 코디네이트들을 프로젝트에 적용
• 원격 저장소
– 의존성 관리와 관련한 메이븐 산출물들의 저장소
• 빌드 로직의 전역적인 재사용
– 플러그인 동작 시 외부 파일 참조하지 않음
• 툴에 대한 이식성과 통합
– 이클립스, 넷빈즈, IntelliJ 같은 툴의 프로젝트 정보 표준화
• 프로젝트 산출물의 쉬운 검색과 필터링
– 넥서스(Nexus)와 같은 툴은 POM안의 정보 저장소를 사용
하여 저장소의 내역들을 인덱스하고 검색을 허용함
POM(Project Object Model)
<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
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>my-app</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
POM
• POM Relationships
– 다른 프로젝트와의 의존성 정의. 코디네이트 정의. 부
모, 서브 모듈 정의.
• General project information
– 프로젝트 이름, URL, 조직, 개발자, 기여자, 라이선스
• Build settings
– Maven build 커스터마이징. 소스, 테스트 코드 위치 변
경. 플러그인 추가, 플러그인 goal을 라이프사이클에
지정
• Build environment
– Development, Production 등의 프로파일 정의
Super POM
• 모든 maven 프로젝트
는 묵시적으로 Super
POM을 상속 받음
– http://maven.apache.or
g/guides/introduction/in
troduction-to-the-
pom.html#Super_POM
근간이 되는 Super POM
Effective POM
• Super POM, 부모 POM과의 조합에 의해
실제로 동작하는 POM이 된다.
$ mvn help:effective-pom
Plugins and Goals
• Maven은 실제로 Maven
Plugin들의 핵심
framework 일 뿐이다
• Compile, jar 생성 등의 실
제 액션은 모두 plugin이
담당함
• Plugin은 하나 이상의
goal들의 집합임
• Goal은 작업의 단위
• $mvn pluginId:goalId
Maven Lifecycle
Maven Lifecycle(계속)
$ mvn resources:resources 
compiler:compile 
resources:testResources 
compiler:testCompile 
surefire:test 
jar:jar 
install:install
각 단계가 실행될 때 연결되는 goal
$ mvn install 과 동일한 결과
Maven Lifecycle(계속)
Maven Coordinates
• groupId
– 조직, 회사, 팀
– com.nkia.cygnus
• artifactId
– 프로젝트를 표현
• version
– 프로젝트 진행 중일 경
우 SNAPSHOT을 붙힘
• Packaging
– war, jar
Maven Repositories
• 중앙 저장소
– http://repo1.maven.org/maven2
– 개발자 임의로 배포 불가
• 로컬 저장소
– C:UsersUSERNAME.m2repository
– Maven 빌드 시 다운로드 되는 저장소
• 원격 저장소
– 사내 원격 저장소
– 스프링 소스에서 제공하는 외부(공개) 저장소
• 저장소 디렉토리 구조
– /<groupId>/<artifactId>/<version>/<artifactId>-
<version>.<packaging>
– /org/apache/commons/commons-email/1.1/ commons-email-
1.1.jar
Maven Repositories(계속)
인트라넷 인터넷
Maven 중앙 저장소 검색
• http://mvnrepository.com
• http://search.maven.org/
Maven의 의존성 관리
• pom.xml의 <dependencies> 에서 설정
• 의존성 전이(transitive dependency)
– 1. A -> B
– 2. B -> A 관계가 없다
– 3. B -> C
– A와 C는 직접적인 연관관계가 없지만 함수 종속이
발생하여 A -> C라는 의존성 전이가 성립
• 프로젝트에서 직접적으로 사용하는 라이브러
리의 의존성만 정의하면 나머지 의존성은
maven이 묵시적으로 추가함
Maven의 의존성 관리(계속)
$ mvn dependency:resolve
$ mvn dependency:tree
의존성 목록 확인
의존성 관계 구조 확인
$ mvn dependency:analyze
의존성 분석 : 바이트 코드 분석을 통해 의존성 문제 제시
- 사용되었지만 정의 되지 않은 의존성
- 사용되지 않았지만 정의된 의존성
의존성 버전 범위
• (, ) 배제 한정자(Exclusive quantifiers)
• [, ] 포함 한정자(Inclusive quantifers)
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>[3.8,4.0)</version>
<scope>test</scope>
</dependency>
Junit 3.8이상 4.0미만
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>[,3.8.1)</version>
<scope>test</scope>
</dependency>
Junit 3.8.1 미만
의존성 충돌 해결
• 다른 프로젝트의 의존성 전이를 제거
<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>
의존성 전이 배제와 교체
의존성 Scope
• compile
– 기본 스코프. 모든 상황에서 classpath에 추가되며 패키지에 포함된다.
• provided
– Compile시에는 classpath에 포함되지만. 패키지에 포함되지 않는다.
– Servlet API JAR 같은 경우
• runtime
– Runtime시에만 필요한 경우
– JDBC Driver 같은 경우
• test
– 테스트 컴파일과 실행 시 만 동작
• system
– 로컬 파일의 jar 경로 지정 필요
– 패키지에 포함되지 않는다
– 이 스코프는 권장되지 않는다. Public 혹은 커스텀 메이븐 저장소에서 디
펜던시를 참조하도록 노력하자.
의존성 스코프와 의존성 전이의 관
계
사이트 생성과 리포팅
• 프로젝트 문서와 리포트 생성
• target/site 디렉토리에 결과물 생성
• Site descriptor 수정을 통해 레이아웃을 정
의할 수 있음
– src/site/site.xml
• http://maven.apache.org/guides/mini/guide
-site.html
$ mvn site
$ mvn site:run
Archetype
• Maven 프로젝트 템플릿 툴킷
• “원래 모델이나 형태를 따르는 다른 유사한 것을 패
턴화한 것(프로토타입)”
• 간단한 스윙 어플리케이션에서 복잡한 웹 어플리케
이션에 이르기 까지 수많은 archetype을 활용할 수
있다.
• 표준 프레임워크와 의존 관계가 있는 라이브러리
• 프로젝트에 공통으로 필요한 설정 파일
• 표준 프레임워크 기반으로 작성한 샘플 소스
• 사내 저장소에 프로젝트 아키타입 생성 및 배포
$ mvn archetype:generate
Simple Weather Project
• http://www.sonatype.com/books/mvnex-
book/reference/customizing-sect-creating-
simple-weather.html
Simple Web Application
• http://www.sonatype.com/books/mvnex-
book/reference/web.html
Multi Module Project
• http://www.sonatype.com/books/mvnex-
book/reference/multimodule.html
simple-parent
simple-weather simple-webapp
Super POM 상속
모듈
Multi Module Enterprise Project
• http://www.sonatype.com/books/mvnex-
book/reference/multimodule-web-spring.html
Maven 활용 계획
• Cygnus modularity
– Sub project
– Library
– Project를 나누어 개발한 후 제품 패키징
• OSGi Bundle
– Maven을 통한 feature install
• 프로젝트 사이트 문서화
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
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

More Related Content

What's hot

Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodedpTablo
 
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)중선 곽
 
오늘 당장 시작하는 HTML5
오늘 당장 시작하는 HTML5오늘 당장 시작하는 HTML5
오늘 당장 시작하는 HTML5Taegon Kim
 
소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙Hong Hyo Sang
 
[오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core [오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core Ji-Woong Choi
 
bamboo 로 PHP 프로젝트 지속적인 배포
bamboo 로 PHP 프로젝트 지속적인 배포bamboo 로 PHP 프로젝트 지속적인 배포
bamboo 로 PHP 프로젝트 지속적인 배포KwangSeob Jeong
 
웹-프론트엔드 프레임워크를 고르기 위한 팁
웹-프론트엔드 프레임워크를 고르기 위한 팁웹-프론트엔드 프레임워크를 고르기 위한 팁
웹-프론트엔드 프레임워크를 고르기 위한 팁WebFrameworks
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기JinKwon Lee
 
Universal Rendering
Universal RenderingUniversal Rendering
Universal RenderingTaegon Kim
 
Java Build Tool
Java Build ToolJava Build Tool
Java Build Tool용근 권
 
개발 방식을 바꾸는 15가지 기술
개발 방식을 바꾸는 15가지 기술개발 방식을 바꾸는 15가지 기술
개발 방식을 바꾸는 15가지 기술중선 곽
 
우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈용근 권
 
Tomcat monitoring using_javamelody
Tomcat monitoring using_javamelodyTomcat monitoring using_javamelody
Tomcat monitoring using_javamelody중선 곽
 
Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기KwangSeob Jeong
 

What's hot (19)

Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCode
 
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
오픈소스 프레임워크 기반 웹 서비스 설계 (Example)
 
오늘 당장 시작하는 HTML5
오늘 당장 시작하는 HTML5오늘 당장 시작하는 HTML5
오늘 당장 시작하는 HTML5
 
Maven
MavenMaven
Maven
 
소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙소프트웨어 개선 그룹(Sig) 개발 원칙
소프트웨어 개선 그룹(Sig) 개발 원칙
 
[오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core [오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core
 
bamboo 로 PHP 프로젝트 지속적인 배포
bamboo 로 PHP 프로젝트 지속적인 배포bamboo 로 PHP 프로젝트 지속적인 배포
bamboo 로 PHP 프로젝트 지속적인 배포
 
웹-프론트엔드 프레임워크를 고르기 위한 팁
웹-프론트엔드 프레임워크를 고르기 위한 팁웹-프론트엔드 프레임워크를 고르기 위한 팁
웹-프론트엔드 프레임워크를 고르기 위한 팁
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기
 
Universal Rendering
Universal RenderingUniversal Rendering
Universal Rendering
 
Java Build Tool
Java Build ToolJava Build Tool
Java Build Tool
 
개발 방식을 바꾸는 15가지 기술
개발 방식을 바꾸는 15가지 기술개발 방식을 바꾸는 15가지 기술
개발 방식을 바꾸는 15가지 기술
 
우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈
 
iOS9 소개
iOS9 소개iOS9 소개
iOS9 소개
 
Tomcat monitoring using_javamelody
Tomcat monitoring using_javamelodyTomcat monitoring using_javamelody
Tomcat monitoring using_javamelody
 
Springmvc
SpringmvcSpringmvc
Springmvc
 
okspring3x
okspring3xokspring3x
okspring3x
 
Learning Laravel
Learning LaravelLearning Laravel
Learning Laravel
 
Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기Laravel로 스타트업 기술 스택 구성하기
Laravel로 스타트업 기술 스택 구성하기
 

Viewers also liked

목 오브젝트(Mock Object)의 이해
목 오브젝트(Mock Object)의 이해목 오브젝트(Mock Object)의 이해
목 오브젝트(Mock Object)의 이해Yong Hoon Kim
 
소프트웨어 개발자 로드맵
소프트웨어 개발자 로드맵소프트웨어 개발자 로드맵
소프트웨어 개발자 로드맵중선 곽
 
TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기Wonchang Song
 
자동화된 Test Case의 효과
자동화된 Test Case의 효과자동화된 Test Case의 효과
자동화된 Test Case의 효과도형 임
 
Spring-Boot (springcamp2014)
Spring-Boot (springcamp2014)Spring-Boot (springcamp2014)
Spring-Boot (springcamp2014)sung yong jung
 
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례Jemin Huh
 
스프링 부트와 로깅
스프링 부트와 로깅스프링 부트와 로깅
스프링 부트와 로깅Keesun Baik
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Testbeom kyun choi
 

Viewers also liked (10)

목 오브젝트(Mock Object)의 이해
목 오브젝트(Mock Object)의 이해목 오브젝트(Mock Object)의 이해
목 오브젝트(Mock Object)의 이해
 
소프트웨어 개발자 로드맵
소프트웨어 개발자 로드맵소프트웨어 개발자 로드맵
소프트웨어 개발자 로드맵
 
TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기TDD.JUnit.조금더.알기
TDD.JUnit.조금더.알기
 
자동화된 Test Case의 효과
자동화된 Test Case의 효과자동화된 Test Case의 효과
자동화된 Test Case의 효과
 
Spring-Boot (springcamp2014)
Spring-Boot (springcamp2014)Spring-Boot (springcamp2014)
Spring-Boot (springcamp2014)
 
TEST?
TEST?TEST?
TEST?
 
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
Spring boot 를 적용한 전사모니터링 시스템 backend 개발 사례
 
스프링 부트와 로깅
스프링 부트와 로깅스프링 부트와 로깅
스프링 부트와 로깅
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
 
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 TestOkjsp 13주년 발표자료: 생존 프로그래밍 Test
Okjsp 13주년 발표자료: 생존 프로그래밍 Test
 

Similar to Maven의 이해

Backend Master | 3.1.2 Build - Java build tool - Maven
Backend Master | 3.1.2 Build - Java build tool - MavenBackend Master | 3.1.2 Build - Java build tool - Maven
Backend Master | 3.1.2 Build - Java build tool - MavenKyunghun Jeon
 
20170310 tech day-1st-maven을 이용한 프로그램 빌드-박준홍
20170310 tech day-1st-maven을 이용한 프로그램 빌드-박준홍20170310 tech day-1st-maven을 이용한 프로그램 빌드-박준홍
20170310 tech day-1st-maven을 이용한 프로그램 빌드-박준홍ymtech
 
Backend Master | 3.1.4 Build - Java build tool - Maven/Gradle Build Lifecycle
Backend Master | 3.1.4 Build - Java build tool - Maven/Gradle Build LifecycleBackend Master | 3.1.4 Build - Java build tool - Maven/Gradle Build Lifecycle
Backend Master | 3.1.4 Build - Java build tool - Maven/Gradle Build LifecycleKyunghun Jeon
 
JCO 11th 클라우드 환경에서 Java EE 운영 환경 구축하기
JCO 11th 클라우드 환경에서 Java EE 운영 환경 구축하기JCO 11th 클라우드 환경에서 Java EE 운영 환경 구축하기
JCO 11th 클라우드 환경에서 Java EE 운영 환경 구축하기Ted Won
 
양파지기 - Ant, Maven, Gradle
양파지기 - Ant, Maven, Gradle양파지기 - Ant, Maven, Gradle
양파지기 - Ant, Maven, Gradleyong geun Kwon
 
maven 소개
maven 소개maven 소개
maven 소개Suan Lee
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: YeomanJae Sung Park
 
Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)Jaesup Kwak
 
01.개발환경 교육교재
01.개발환경 교육교재01.개발환경 교육교재
01.개발환경 교육교재Hankyo
 
Sonatype nexus 로 docker registry 관리하기
Sonatype nexus 로 docker registry 관리하기Sonatype nexus 로 docker registry 관리하기
Sonatype nexus 로 docker registry 관리하기KwangSeob Jeong
 
AWS Code 서비스 특집 - 아마존 DevOps와 CodeDeploy, CodePipeline (윤석찬)
AWS Code 서비스 특집 - 아마존 DevOps와 CodeDeploy, CodePipeline (윤석찬)AWS Code 서비스 특집 - 아마존 DevOps와 CodeDeploy, CodePipeline (윤석찬)
AWS Code 서비스 특집 - 아마존 DevOps와 CodeDeploy, CodePipeline (윤석찬)Amazon Web Services Korea
 
세션2_데보션테크데이_Decapod_v1.2.pdf
세션2_데보션테크데이_Decapod_v1.2.pdf세션2_데보션테크데이_Decapod_v1.2.pdf
세션2_데보션테크데이_Decapod_v1.2.pdfJaesuk Ahn
 
Source To URL Without Dockerfile
Source To URL Without DockerfileSource To URL Without Dockerfile
Source To URL Without DockerfileWon-Chon Jung
 
Opensource java library deploy public repository
Opensource java library deploy public repositoryOpensource java library deploy public repository
Opensource java library deploy public repositoryKyungHo Jung
 
N02 app engineseminar
N02 app engineseminarN02 app engineseminar
N02 app engineseminarSun-Jin Jang
 
Service Worker 를 이용한 
Offline Web Application 구현
Service Worker 를 이용한 
Offline Web Application 구현Service Worker 를 이용한 
Offline Web Application 구현
Service Worker 를 이용한 
Offline Web Application 구현병태 정
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rdPark Jonggun
 
빌드교육자료 작성중
빌드교육자료 작성중빌드교육자료 작성중
빌드교육자료 작성중Sukjin Yun
 

Similar to Maven의 이해 (20)

Backend Master | 3.1.2 Build - Java build tool - Maven
Backend Master | 3.1.2 Build - Java build tool - MavenBackend Master | 3.1.2 Build - Java build tool - Maven
Backend Master | 3.1.2 Build - Java build tool - Maven
 
20170310 tech day-1st-maven을 이용한 프로그램 빌드-박준홍
20170310 tech day-1st-maven을 이용한 프로그램 빌드-박준홍20170310 tech day-1st-maven을 이용한 프로그램 빌드-박준홍
20170310 tech day-1st-maven을 이용한 프로그램 빌드-박준홍
 
Backend Master | 3.1.4 Build - Java build tool - Maven/Gradle Build Lifecycle
Backend Master | 3.1.4 Build - Java build tool - Maven/Gradle Build LifecycleBackend Master | 3.1.4 Build - Java build tool - Maven/Gradle Build Lifecycle
Backend Master | 3.1.4 Build - Java build tool - Maven/Gradle Build Lifecycle
 
JCO 11th 클라우드 환경에서 Java EE 운영 환경 구축하기
JCO 11th 클라우드 환경에서 Java EE 운영 환경 구축하기JCO 11th 클라우드 환경에서 Java EE 운영 환경 구축하기
JCO 11th 클라우드 환경에서 Java EE 운영 환경 구축하기
 
양파지기 - Ant, Maven, Gradle
양파지기 - Ant, Maven, Gradle양파지기 - Ant, Maven, Gradle
양파지기 - Ant, Maven, Gradle
 
maven 소개
maven 소개maven 소개
maven 소개
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman
 
Spring boot
Spring bootSpring boot
Spring boot
 
Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)
 
01.개발환경 교육교재
01.개발환경 교육교재01.개발환경 교육교재
01.개발환경 교육교재
 
Sonatype nexus 로 docker registry 관리하기
Sonatype nexus 로 docker registry 관리하기Sonatype nexus 로 docker registry 관리하기
Sonatype nexus 로 docker registry 관리하기
 
AWS Code 서비스 특집 - 아마존 DevOps와 CodeDeploy, CodePipeline (윤석찬)
AWS Code 서비스 특집 - 아마존 DevOps와 CodeDeploy, CodePipeline (윤석찬)AWS Code 서비스 특집 - 아마존 DevOps와 CodeDeploy, CodePipeline (윤석찬)
AWS Code 서비스 특집 - 아마존 DevOps와 CodeDeploy, CodePipeline (윤석찬)
 
세션2_데보션테크데이_Decapod_v1.2.pdf
세션2_데보션테크데이_Decapod_v1.2.pdf세션2_데보션테크데이_Decapod_v1.2.pdf
세션2_데보션테크데이_Decapod_v1.2.pdf
 
Source To URL Without Dockerfile
Source To URL Without DockerfileSource To URL Without Dockerfile
Source To URL Without Dockerfile
 
Opensource java library deploy public repository
Opensource java library deploy public repositoryOpensource java library deploy public repository
Opensource java library deploy public repository
 
Jenkins with AWS
Jenkins with AWSJenkins with AWS
Jenkins with AWS
 
N02 app engineseminar
N02 app engineseminarN02 app engineseminar
N02 app engineseminar
 
Service Worker 를 이용한 
Offline Web Application 구현
Service Worker 를 이용한 
Offline Web Application 구현Service Worker 를 이용한 
Offline Web Application 구현
Service Worker 를 이용한 
Offline Web Application 구현
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd
 
빌드교육자료 작성중
빌드교육자료 작성중빌드교육자료 작성중
빌드교육자료 작성중
 

Maven의 이해

  • 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 프로젝트 생성 프로젝트 빌드와 패키징 프로젝트 실행
  • 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안의 정보 저장소를 사용 하여 저장소의 내역들을 인덱스하고 검색을 허용함
  • 14. POM(Project Object Model) <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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mycompany.app</groupId> <artifactId>my-app</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>my-app</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
  • 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 과 동일한 결과
  • 22. Maven Coordinates • groupId – 조직, 회사, 팀 – com.nkia.cygnus • artifactId – 프로젝트를 표현 • version – 프로젝트 진행 중일 경 우 SNAPSHOT을 붙힘 • Packaging – war, jar
  • 23. Maven Repositories • 중앙 저장소 – http://repo1.maven.org/maven2 – 개발자 임의로 배포 불가 • 로컬 저장소 – C:UsersUSERNAME.m2repository – Maven 빌드 시 다운로드 되는 저장소 • 원격 저장소 – 사내 원격 저장소 – 스프링 소스에서 제공하는 외부(공개) 저장소 • 저장소 디렉토리 구조 – /<groupId>/<artifactId>/<version>/<artifactId>- <version>.<packaging> – /org/apache/commons/commons-email/1.1/ commons-email- 1.1.jar
  • 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 의존성 분석 : 바이트 코드 분석을 통해 의존성 문제 제시 - 사용되었지만 정의 되지 않은 의존성 - 사용되지 않았지만 정의된 의존성
  • 28. 의존성 버전 범위 • (, ) 배제 한정자(Exclusive quantifiers) • [, ] 포함 한정자(Inclusive quantifers) <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>[3.8,4.0)</version> <scope>test</scope> </dependency> Junit 3.8이상 4.0미만 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>[,3.8.1)</version> <scope>test</scope> </dependency> Junit 3.8.1 미만
  • 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 혹은 커스텀 메이븐 저장소에서 디 펜던시를 참조하도록 노력하자.
  • 31. 의존성 스코프와 의존성 전이의 관 계
  • 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
  • 34. Simple Weather Project • http://www.sonatype.com/books/mvnex- book/reference/customizing-sect-creating- simple-weather.html
  • 35. Simple Web Application • http://www.sonatype.com/books/mvnex- book/reference/web.html
  • 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