Tools

앵버박사 2014. 10. 8. 10:03

사내 세미나로 메이븐에 대해 발표를 했었는데요, 그 내용을 공유하려고 합니다.


주된 내용은 자바 세상의 빌드를 이끄는 메이븐(저_박재성) 1~6장 정리입니다.


도움이 되시는 분이 계셨으면 좋겠네요~!





발표자료 보기







2장 메이븐 설치 및 템플릿 프로젝트 생성


설치

  - 다운로드 : http://maven.apache.org/download.cgi - 원하는 버전의 바이너리(binary) zip을 다운받는다.

  - 압축을 원하는 위치에 풀고, 시스템 환경변수 PATH에 MAVEN_HOME/bin을 추가

  - 프롬프트에서 mvn -version 으로 확인

  - 기본적으로 자바가 설치되어 있어야 하고 JAVA_HOME을 환경변수로 잡아놔야 함


템플릿 프로젝트 생성

  - 메이븐은 여러가지 구조의 프로젝트 템플릿을  제공한다. 이를 아키타입(archetype)이라고 한다.(중앙저장소에 있음)

  - mvn archetype:generate -DgroupId=com.nhnent -DartifactId=helloworld -DarchetypeArtifactId=maven-archetype-webapp

  - pom.xml 확인

  - 프로젝트 구조 확인(자바소스 관리하는 부분이 빠져있음)


명령어

  - 메이븐 명령어 구성 : mvn [options] [<goal(s)>] [<phase(s)>]

  - mvn -help, mvn -version

  - 인자전달 옵션은 -D

  - 아키타입 목록확인 : mvn archetype:generate -DarchetypeCatalog=internal

  - 인터렉티브 모드로 생성 : mvn archetype:generate



3장 메이븐 개요 및 설정파일


settings.xml

  - 메이븐 툴과 관련된 설정을 담당

  - MAVEN_HOME/conf에 위치, 사용자별 적용하려면 USER_HOME/.m2 밑에 설정 가능

  - 로컬저장소의 기본위치는 USER_HOME/.m2/repository 인데 바꾸려면 settings.xml의 localRepository엘리먼트를 변경하면 됨  


프로젝트 설정파일

  - 프로젝트 내 빌드설정에 관련된 내용을 담당

  - 기본적으로 pom(Project Object Model) 이라는 이름이지만 mvn -f xxxx.xml 로 다른파일로 바꿀수 있음

  - pom에 설정되는 내용은 크게 4가지로 분류

    1) 프로젝트 기본정보 : 프로젝트 이름, URL, 참여자, 라이센스

    2) 프로젝트 관계설정 : groupId, artifactId, version, 모듈, 상속, 의존라이브러리

    3) 빌드 설정 : 소스/테스트 소스 디렉터리, 리소스 디렉터리, 플러그인, 리포팅

    4) 빌드 환경 : 빌드할 환경에 따른 정보, 프로파일

  - 프로젝트 기본, 관계설정 관련 엘리먼트 설명 : 3장 8페이지 참조


최상위 pom 설정 파일

  - 기본 상속하고 있는 부모 설정파일

  - mvn help:effective-pom 으로 내용 확인가능

  - 이녀석 때문에 우리 프로젝트에서는 많은 설정을 하지 않아도 메이븐 빌드의 많은 기능을 사용할 수 있음

  - 최상위 폼 간단설명 : 3장 10페이지 하단 참조

  - 프로젝트 설정파일에서 재정의하면 최상위 설정파일 내용을 덮어쓸 수 있음

  - 다른 프로젝트 경로는 build엘리먼트에서 하고, webapp관련은 war플러그인에서 함



4장 메이븐 라이프사이클


라이프사이클과 페이즈

  - 크게 3가지로 나뉨(그림 사용 5페이지)

  - 기본 라이프 사이클 : 페이즈들 compile(소스코드 컴파일)->test(단위 테스트프레임워크의 테스트 진행)->package(jar,war등으로 압축)->install(로컬저장소로 배포)->deploy(원격저장소로 배포) - 더 많은 페이즈가 있지만 주요한 것만

  - clean 라이프사이클 : 페이지들 clean(빌드로 생성된 모든결과 즉 target 삭제)

  - site 라이크사이클 : 페이즈들 site(target/site 에 문서 사이트 생성)->site-deploy(문서 사이트를 설정된 서버로 배포)

  - 메이븐은 라이프 사이클이 있고 그 라이프 사이클을 구성하는 각 단계를 페이즈라고 한다.

  - 높은 단계의 페이즈를 실행하면 그 아래단계 페이즈부터 차례로 실행된다.


페이즈와 플러그인

  - 메이븐의 모든기능은 플러그인을 기반으로 동작한다. 페이즈도 다 플러그인에 연결되있는 동작이다.

  - 플러그인 pom.xml 설정법 7페이지 참조

  - 플러그인에서 실행할 수 있는 각각의 작업을 골(goal)이라고 한다.

  - compiler 플러그인의 소스코드 컴파일 complie골, 테스트 소스코드 컴파일 testComplie골, 컴파일러플러그인 도움말 제공 help골

  - 플러그인 실행방법 : mvn groupId:artifactId:version:goal(예, mvn org.apache.maven.plugins:maven-complier-plugin:2.1:complie)

  - 쉽게 실행하기 위해 줄여 쓸수 있다.

    1) 로컬 저장소 내 최신버전을 쓰길 원한다면 버전은 생략가능

    2) maven-$name-plugin 또는 &name-maven-plugin 형식의 artifactId를 사용한다면 &name만 사용해서 실행 가능

    3) settings.xml에서 플러그인 그룹을 관리할 수 있는데 관리된 그룹목록에 포함된 플러그인이면 그룹아이디 생략가능(settings.xml에 설정방법은 9페이지 참조)

  - 기본적인 플러그인은 org.apache.maven.plugins 와 org.codehaus.mojo 에 속해있는데 이는 settings.xml에 없어도 기본으로 설정된다.

  - 한개의 페이즈는 한개의 골과 연결된다.

  - 페이즈와 골의 연결관계 그림 : 페이지 11 참조

  - 예로 mvn test를 실행하면 로그에 플러그인:골의 실행 순서대로 내역이 나온다.

  - 메이븐에서 페이즈는 빌드 라이프사이클에서 빌드 단계와 각 단계의 순서만을 정의하고 있는 개념이다.


기본 페이즈와 플러그인

  - mvn process-resources : resources:resoureces의 실행으로 resource디렉터리에 있는 내용을 target/classes로 복사(자바소스쪽에 있는 리소스들을 복사하도록 설정하는 방법 : 페이지13 하단 예제 참조)

  - mvn complie : complier:complie의 실행으로 src/java 및의 모든 자바소스를 컴파일해서 target/classes로 컴파일

  - 컴파일러 플러그인에 자바버전과 인코딩 설정방법 : 페이지 15의 4-3 참조

  - 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 : 테스트하지 않고 빌드를 진행한다.(pom.xml의 properties엘리먼트 또는 surefire플러그인에 직접 추가해도됨 : 페이지 18 참조)

  - 테스트 실패해도 넘어가기 설정 : 페이지 18 참조

  - 테스트 프레임워크 종류 지정 : 페이지 19 참조

  - mvn package : target디렉터리 하위에 jar,war,ear등의 압축파일 생성, 이름은 build엘리먼트의 finalName엘리먼트의 값을 사용, 지정되지 않을 경우 "아티팩트아이디-버전”의 이름으로 압축됨(각 압축종류별로 플러그인이 필요, 빌드 시 알아서 다운로드함)

  - mvn install : 로컬 저장소로 배포

  - mvn deploy : 원격 저장소로 배포

  - mvn clean : 빌드를 통해 생성된 target디렉터리 삭제

  - mvn clean test, mvn clean install : 이전 빌드로 인해 남아있는 산출물의 문제로 빌드 오류가 발생하는 경우, 이런식으로 할 수 있음

  - mvn site : target/site에 문서사이트 생성

  - mvn site-deploy : 문서 사이트를 서버로 배포



5장 의존 라이브러리 관리


 메이븐 의존라이브러리 관리

  - 기존 관리방법 : 페이지4의 그림사용

  - 가장 중요한 기능이다!

  - 메이븐 저장소는 세가지로 나뉨 : 중앙 저장소, 원격 저장소(스프링소스에서 제공하는거나 사내 저장소 같은 애들), 로컬 저장소(USER_HOME/.m2/repository)

  - pom.xml 메이븐 저장소 설정 방법 : 페이지6 참조(id, name, url)

  - 설정된 순서대로 라이브러리를 찾고 못찾으면 그 다음 저장소에서 찾음

  - dependency 엘리먼트 설정방법 : 페이지7 참조

  - 기본 중앙저장소(http://repo.maven.org/maven2/)에 접근 -> groupId/artifactId/version 에 존재하는 ${artifactId}-${version}.jar 파일을 다운로드 -> 최종적으로   http://repo.maven.org/maven2/junit/junit/3.8/junit-3.8.jar 가 있는지 확인 후 다운로드  

  - 그룹아이디/아티팩트아이디로 폴더를 만들어 로컬 저장소에 저장  

  - 빌드 시 로컬저장소에 있으면 로컬꺼 쓰고 없으면 원격에서 다운  로드 한다.  

  - 이렇게 pom.xml로 의존관계를 관리하니까 라이브러리로 형상관리  툴의 용량을 차지하지 않고 pom.xml만 공유하면 된다.  

  - http://mvnrepository.com : 라이브러리 검색 - pom.xml에 어  떻게 쓰면되는지 다 나옴  

  - 의존 라이브러리 버전 : 페이지14 참조  

  - 버전뒤에 SNAPSHOT을 붙이는 것은 개발  중 버전인 것이다. 이렇게 된것을 의존하면 원격을 수시로 체크해서 다운로드해온다. 로컬에 있어도 새것이 올라왔으면 원격에서 다운로드한다.(타임스탬프 활용)  

  - mvn clean dependency:copy-dependencies package : dependency:copy-dependencies 이 부분이 로컬저장소의 jar파일을 target/dependency 디렉터리로 복사해줌  

  - pom 파일에 설정되어 있는 모든 라이브러리에 대한 의존 관계를 가질 경우 위키북 프로젝트가 의존하는 라이브러리 수는 급격하게 증가할 것이다. 메이븐은 이 같은 문제점을 해결하기 위하여 의존 관계에 있는 라이브러리를 제한하기 위하여 의존성 전이에 대한 설정이 가능하도록 지원하고 있다.

  - 의존성 전이 : 페이지19 그림사용, 중앙 저장소에서 다운로드 받을때 .pom 파일도 같이 받는데 이곳에 의존성 정보가 들어있다. 따라서 그 라이브러리를 받으면 그 라이브러리와 의존관계에 있는 라이브러리들도 자동으로 다운로드 받는다.

  - 의존성 중개 : A->B->C->D2.0 이고 A->E->D1.0이면 A프로  젝트는  D1.0을 사용한다. 가까운 쪽과 의존관계를 갖음, 만약 D2.0을 사용하고 싶다면 pom.xml에 명시해야 함

  - 의존성 관리 : dependencyManagement엘리먼트에 의존관계에 있는 엘리먼트와 버전명시, 위에서  D2.0을 사용하겠다고 명시가능

  - 의존성 스코프 : 페이지 15참조  

  - 의존성 예외 : exclusion 엘리먼트로 뺀다.(페이지 23 참조  )

  선택적 의존성 : optional(페이지21 참조)  

  - mvn dependency:tree -> 의존성 관계를 트리형태로 보여줌 : 확인하고 필요없는 의존성 제거하는 등에 사용가능

  - 의존성 스코프와 전이와의 관계 : 페이지 24 표5-1 참조


속성(properties)

  - 공통변수로 사용가능(사용법 페이지25 참조)

  - pom/project속성으로 미리 정의된 프로퍼티가 있음(페이지 26 참조)

  - settings.xml에 설정된 엘리먼트값을 사용할 수 있음(페이지 26 참조)

  - 시스템 환경변수도 사용가능, env접두어 사용(페이지 27 참조)

  - 자바시스템속성도 참조가능

  - ${basedir} : pom.xml 파일이 있는 디렉터리 위치



6장 메이븐과 이클립스 통합


메이븐의 이클립스 플로그인 사용

  - 메이븐 플러그인 목록 확인 : 1) http://maven.apache.org/plugins/index.html(메이븐사이트), 2) http://mojo.codehaus.org/plugins.html(모조프로젝트) -> 여러 커뮤니티 및 개발자가 모여 플러그인을 관리하기 위해 만든 프로젝트로 플러그인 제작하고 싶으면 이곳 문서를 참조해서 해라 배포도 여기로 할 수 있음  

  - 위에서 찾아보면 사용법 잘 나옵니다. 옵션 등 확인하세요  

  - 설정파일에 없는 플러그인 사용할 경우 기본적으로 그룹아  이디 org.apache.maven.plugin 아티팩트아이디 mavn-$name-plugin 을 찾는다.  

  - 이클립스 플러그인은 메이븐 사이트에서 제공하는 애라서   따로 설정 안해도됨  

  mvn eclipse:eclipse : .project.xml, .classpath 등   이클립스 메타파일을 생성해줌 이러면 이클립스에서 임포트 가능  

  - pom.xml의 의존관계가 및 소스코드, 컴파일 경로가 .classpath에 알아서 잘 추가됨(단 M2_REPO 변수 설정해야함 - window>preferences>java>bulid path>classpath variables>new 한 후 지정)  

  - 이클립스의 하위프로젝트인 Web Tools Project(WTP)를 위한 Dynamic Web Project로 생성하기 설정 : 페이지15참조(.settings 가 생김)

  - Web Tools Project(이하 WTP)의 .settings 디렉토리

  - mvn eclise:clean eclipse:eclipse : 클린 후 재생성

  - 자바버전 틀린경우 맞추기 : 페이지 15 하단 참조

  - 스프링 Nature 속성 추가하기 : 페이지 21참조

  - 재컴파일 후에도 Nature속성 유지하기 : 페이지 22참조


이클립스의 m2ecipse 플러그인 사용

  - 플러그인 설치 : 마켓플레이스에서 maven치면 나오는 메이븐 통합 어쩌구

  - 프로젝트 생성 : file>new>project>maven project>create a simple project 체크하고 작성(안 체크하면 아키타입 고름)

  - 이클립스랑 알아서 연동되니 편하다

  - 레파지토리 변경 : 프로퍼런스>메이븐>유저세팅즈 에서 함

  - USER_HOME/.m2에 settings.xml파일을 만들어야 메이븐 명령어 사용가능, MAVEN_HOME/conf에서 복사

  - run as에서 메이븐 명령어 사용가능.

  - maven build… 을 선택 goals에다가 골이나 페이즈를 쓰면됨

  - pom.xml을 보면 탭으로 다양하게 있음, 디펜덴시스(라이브러리 검색기능 제공), 플러그인, 하이러키, 그래프 등



기타

  - 빌드툴 흐름 : 앤트->(의존성관리 차이, 자유도하락 대신 중복제거(일관된 구조, 표준화), 저장소 차이)->메이븐->그래들 



다음에 해야할일

  - 원격 저장소 deploy, 원격 저장소 만들기, 플러그인 만들기, pom.xml의 다른 설정들 알아보기 등



참고자료

  1.허광남 유투브 - 메이븐 시작하기(https://www.youtube.com/watch?v=5dN1WTj222Y)   

  2.박재성 자바지기 - http://www.slipp.net/wiki/pages/viewpage.action?pageId=10420233