5. 4
살펴보기
메이븐 설치 및 템플릿 프로젝트 생성
2
MAVEN 다운로드
maven.apache.org/download.cgi
binary zip 파일을 다운로드
환경변수 추가
PATH 변수에
MAVEN_HOME/bin 을 추가
정상작동 확인
프롬프트에서 mvn -version
MAVEN 설치
6. 5
살펴보기
메이븐 설치 및 템플릿 프로젝트 생성
2 아키타입(archetype)
메이븐이 제공하는 여러가지 구조의 프로젝트 템플릿
mvn archetype:generate -DgroupId=com.nhnent -DartifactId=helloworld
-DarchetypeArtifactId=maven-archetype-webapp
7. 6
살펴보기
메이븐 설치 및 템플릿 프로젝트 생성
2
mvn [options] [<goal(s)>] [<phase(s)>]
mvn -version
mvn archetype:generate -DarchetypeCatalog=internal
mvn archetype:generate -DgroupId=com.nhnent -DartifactId=helloworld
-DarchetypeArtifactId=maven-archetype-webapp
9. 8
설정파일
설정파일만 있으면 끝! settings.xml와 pom.xml
3
• 메이븐 툴과 관련된 설정을 담당
• MAVEN_HOME/conf/ 에 위치, 사용자별 적용하려면 USER_HOME/.m2/ 에 설정 가능
settings.xml
10. 9
설정파일
설정파일만 있으면 끝! settings.xml와 pom.xml
3 pom.xml
pom
프로젝트
관계설정
groupId, artifactId, version
모듈
상속
의존 라이브러리 관리
프로젝트
기본설정
빌드설정
빌드환경
빌드
소스/테스트 디렉토리
리소스(자원) 디렉토리
플러그인
리포팅(문서화)
프로젝트 이름
프로젝트 URL
프로젝트 참여자
라이센스
빌드할 환경에 따른 정보
프로파일
• 프로젝트 내 빌드설정을 담당
• 프로젝트 최상위에 존재
• Project Object Model
• 다른파일 지정 : mvn –f xxx.xml test
11. 10
설정파일
설정파일만 있으면 끝! settings.xml와 pom.xml
3 pom.xml
• project pom.xml 파일의 최상위 엘리먼트
• modelVersion POM 모델의 버전. 가장 최근 버전이 4.0.0이다. POM 모델이 변경되지
않으면 수정할 필요가 없다.
• groupId 프로젝트를 생성하는 조직의 고유 아이디를 결정한다. 일반적으로 도메인 이름을
사용한다.
• artifactId 프로젝트를 식별하는 유일한 아이디를 의미한다. 예를 들어 com.nhnent라는 groupId를 사용하고 있는 조직에 여러 개의 프로
젝트가 존재할 수 있다.
• packaging 프로젝트를 어떤 형태로 패키징할지 결정한다. jar, war, ear, pom 등이 해당된다.
• version 프로젝트의 현재 버전이다. 개발이 완료된 버전일 경우 1.0, 2.0 과 같이 사용하겠지만 프로젝트가 개발 중에는 SNAPSHOT을 접
미사로 사용할 수 있다. SNAPSHOT은 메이븐의 예약어이며, SNAPSHOT을 사용한다면 라이브러리를 다른 방식으로 관리한다.
• name 프로젝트 이름
• url 프로젝트 사이트가 있다면 사이트 URL 을 등록한다.
• dependencies <dependencies/> 엘리먼트와 하위 엘리먼트인 <dependency/>는 프로젝트와 의존관계에 있는 라이브러리를 관리한다.
12. 11
설정파일
설정파일만 있으면 끝! settings.xml와 pom.xml
3 pom.xml
• 최상위 pom 설정 파일
• 모든 pom.xml이 기본으로 상속하고 있는 부모 설정파일
• mvn help:effective-pom 으로 내용 확인
• 기본으로 생성된 pom.xml에 별 내용이 없어도 많은 동작을 할 수 있는 이유
• 프로젝트 pom.xml에서 재정의하여 최상위 설정파일의 내용을 덮어 쓸 수 있음
13. 12
설정파일
설정파일만 있으면 끝! settings.xml와 pom.xml
3 pom.xml
• build 프로젝트 빌드와 관련한 기본적인 소스 디렉토리 구조, 빌드 산출
물 디렉토리 구조, 빌드시 사용할 플러그인 정보를 관리한다.
• sourceDirectory 실제 서비스를 담당하는 자바 소스 코드를 관리하는
디렉토리. 기본 값은 src/main/java
• testSourceDirectory 테스트 소스를 관리하기 위한 디렉토리. 메이븐
빌드 툴은 서비스 소스 코드와 테스트 소스 코드를 분리해서 관리하며,
배포 시 테스트 소스 코드가 같이 배포되지 않게 한다. 기본 값은
src/test/java
• outputDirectory sourceDirectory 의 소스를 컴파일한 결과물이 위
치하는 디렉토리. 기본 값은 target/classes
• testOutputDirectory testSourceDirectory 의 소스를 컴파일한 결
과물이 위치하는 디렉토리. 기본 값은 target/test-classes
• resources 서비스에 사용되는 자원을 관리하는 디렉토리. 기본 값은
src/main/resources
• testResources 테스트 시에 필요한 자원을 관리하기 위한 디렉토리.
기본 값은 src/test/resources
• pluginManagement 빌드 설정 파일에서 관리하는 플러그인 목록. 이
엘리먼트에 설정되어 있다고 해서 반드시 사용하는 것은 아니다.
• repositories 빌드할 때 접근할 저장소의 위치를 관리한다. 메이븐 기
본 저장소 URL 은 http://repo1.maven.org/maven2 이다.
15. 14
라이프사이클
페이즈, 플러그인, 골.. 메이븐의 내부동작 원리
4
complie
test
package
install
deploy
clean
site
site-
deploy
기본라이프사이클
celan 라이프사이클
site 라이프사이클
문서 사이트 생성
서버 배포
산출물 생성
로컬 저장소 배포
원격 저장소 배포
16. 15
라이프사이클
페이즈, 플러그인, 골.. 메이븐의 내부동작 원리
4
• 메이븐의 모든 기능은 플러그인을 기반으로 동작
• 페이즈도 플러그인과 연결되어 있다.
• 플러그인에서 실행할 수 있는 각각의 작업을 골(goal)이라고 한다.
• 한 개의 페이즈는 한 개의 골과 연결된다.
• 소스코드를 컴파일하는 complie 골
• 테스트 소스코드 컴파일 testComplie 골
• 도움말 제공 help 골
예) compiler 플러그인
플러그인
17. 16
라이프사이클
페이즈, 플러그인, 골.. 메이븐의 내부동작 원리
4
• 로컬 저장소 내 최신버전을 사용하길 원한다면 버전 생략가능
• maven-$name-plugin 또는 $name-maven-plugin 형식의 artifactId를 사용
한다면 $name만 사용해서 실행 가능
• settings.xml의 플러그인 그룹에 포함된 플러그인이면 groupId 생략가능
• 메이븐 기본 플러그인들이 포함되어 있는 org.apache.maven.plugins와
org.codehaus.mojo는 settings.xml에 없어도 기본으로 설정 됨
플러그인 실행방법
mvn groupId:artifactId:version:goal
예) mvn org.apache.maven.plugins:maven-complier-plugin:2.1:complie
20. 19
라이프사이클
페이즈, 플러그인, 골.. 메이븐의 내부동작 원리
4• mvn process-resources resources:resoureces의 실행으로 resource디렉터리에 있는 내용을 target/classes로 복사
• mvn complie complier:complie의 실행으로 src/java 및의 모든 자바소스를 컴파일해서 target/classes로 컴파일
• mvn process-testResources, mvn test-complie resources:testResources, complier:testCopile 로 test->target/test-classes
로 복사 나머지 동일
• mvn test surefire:test의 실행으로 target/test-classes에 있는 테스트케이스의 단위테스트들을 실행한다. 그리고 그 결과물을
target/surefire-reports에 생성한다.
• mvn -Dtest=클래스패턴1,클래스패턴2,... test 패턴에 해당하는 클래스의 테스트케이스만 검사
• mvn -Dmaven.test.skip=true test 테스트하지 않고 빌드를 진행한다.
• mvn package target디렉터리 하위에 jar, war, ear등의 압축파일 생성, 이름은 build엘리먼트의 finalName엘리먼트의 값을 사용, 지정
되지 않을 경우 "artifactId-version”의 이름으로 압축됨(각 압축종류별로 플러그인이 필요, 빌드 시 알아서 다운로드함)
• mvn install 로컬 저장소로 배포
• mvn deploy 원격 저장소로 배포
• mvn clean 빌드를 통해 생성된 target디렉터리 삭제
• mvn clean test, mvn clean install 이전 빌드로 인해 남아있는 산출물의 문제로 빌드 오류가 발생하는 경우
• mvn site target/site에 문서사이트 생성
• mvn site-deploy 문서 사이트를 서버로 배포
23. 22
의존성관리
메이븐의 핵심기능! 의존 라이브러리 관리
5
하나,
spring 홈페이지
접근
둘,
Spring 라이브러리
다운로드
셋,
압축 해제
넷,
추가/수정할 라이브
러리를 찾아서 복사
기존 라이브러리
관리방법
다섯,
이클립스
클래스패스 수정
24. 23
의존성관리
메이븐의 핵심기능! 의존 라이브러리 관리
5
중앙 저장소
http://repo1.maven.org/maven2
원격 저장소
springsource 저장소
사내 저장소 등
로컬 저장소
USER_HOME/.m2/repository
MAVEN 저장소
25. 24
의존성관리
메이븐의 핵심기능! 의존 라이브러리 관리
5
1. 로컬 저장소 -> 설정한 순서대로 라이브러리를 검색
2. 중앙 저장소(http://repo1.maven.org/maven2/) 에 접근
3. groupId/artifactId/version 에 존재하는 ${artifactId}-${version}.jar 파일을 다운로드
4. 최종적으로 http://repo.maven.org/maven2/junit/junit/3.8.1/junit-3.8.1.jar 가 있는지 확인 후 다운로드
27. 26
의존성관리
메이븐의 핵심기능! 의존 라이브러리 관리
5
Struts2
SpringPROJECT
Hibernate
Apache
Commons
Log4j
의존관계
의존성 전이
• 중앙 저장소에서 다운로드 받을때 *.pom 파일도 같이 받는데 이곳에 의존성 정보가 들어있다.
• 따라서 그 라이브러리를 받으면 그 라이브러리와 의존관계에 있는 라이브러리들도 자동으로 다운로드 받는다.
30. 29
의존성관리
메이븐의 핵심기능! 의존 라이브러리 관리
5 의존성 스코프
• compile 스코프를 설정할지 않았을 때의 기본 스코프이다. 컴파일 시에도 사용되며, 배포 시에도 같이 배포되어야 하는 라이브러리이다.
• provided 예를 들어 servlet.jar는 서블릿 컨테이너에서 제공하므로 컴파일 시점에는 필요하지만, 애플리케이션을 배포할 때 같이 배포될
필요는 없다. 이와 같은 상황에서 사용하는 스코프이다.
• runtime runtime 스코프는 말 그대로 컴파일 시에는 사용되지 않지만 애플리케이션을 실행할 때 사용되는 라이브러리일 경우 설정한다.
• test 테스트하는 시점에만 사용하는 라이브러리에 대한 스코프를 설정할 때 사용한다.
• system system 스코프는 provided와 비슷하다. 단지 우리가 직접 jar 파일을 제공해야 한다. 따라서 이 스코프의 jar 파일은 저장소에서
관리되지 않을 수도 있다.
• import 다른 POM 설정 파일에 정의되어 있는 의존 관계 설정을 현재 프로젝트로 가져온다. 이 범 위는 <dependencyManagement/> 엘
리먼트에서만 사용 가능하다.(메이븐 2.0.9 이후 버전부터 사용 가능)
32. 31
의존성관리
메이븐의 핵심기능! 의존 라이브러리 관리
5 속성(properties)
• ${project.build.directory} target 디렉토리,이 속성은 ${pom.build.directory}와 같다.
• ${project.build.outputDirectory} target/classes 디렉토리이다.
• ${project.name}, ${pom.name} 프로젝트 이름, <project>/<name> 엘리먼트 설정 값.
• ${project.version}, ${pom.version} 프로젝트 버전, 버전 정보는 접두사를 사용하지 않고 ${version}으로도 접근 가능하다.
<project>/<version> 엘리먼트 설정 값.
• ${project.build.finalName} package 페이즈를 실행해 압축된 최종 파일 이름이다. <project>/<build>/<finaleName> 엘리먼트 설정 값
• ${settings.localRepository} 로컬 저장소의 경로를 참조한다.
• ${env.PATH} 시스템의 PATH 설정 값을 참조한다.
• ${env.JAVA_HOME} 시스템의 JAVA_HOME 설정 값을 참조한다.
• ${basedir} pom.xml의 위치
34. 33
이클립스통합
이클립스로 메이븐을 쉽게 사용하기
6
이클립스의 m2eclipse 사용
GUI
maven-
eclipse-
plugin
메이븐의 이클립스 플러그인 사용
Eclipse’s
m2eclipseVS
이클립스 통합
콘솔
35. 34
이클립스통합
이클립스로 메이븐을 쉽게 사용하기
6 플러그인
• 메이븐 홈페이지 : http://maven.apache.org/plugins/index.html
• 모조 프로젝트 : http://mojo.codehaus.org/plugins.html
• 설정파일에 없는 플러그인을 사용할 경우, 기본적으로 groupId가 org.apache.maven.plugin이
고 artifactId가 maven-$name-plugin인 플러그인을 찾는다.
• 이클립스 플러그인은 메이븐에서 기본적으로 제공하는 플러그인으로 따로 설정하지 않아도 된다.
36. 35
이클립스통합
이클립스로 메이븐을 쉽게 사용하기
6 maven-eclipse-plugin
• mvn eclipse:eclipse .project.xml, .classpath 등 이클립스 메타파일을 생성해줌으로써 이
클립스에 import가 가능해진다. pom.xml의 의존관계 및 소스코드, 컴파일 경로 등
이 .classpath에 알맞게 추가된다.
• mvn eclipse:clean mvn eclipse:eclipse로 생성된 결과물을 삭제한다.