레이블이 Maven인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Maven인 게시물을 표시합니다. 모든 게시물 표시

2014년 2월 27일 목요일

Eclipse에 Maven(m2eclipse) 플러그인 설치 및 프로젝트 생성

1. m2eclipse 플러그인 설치

m2eclipse 플러그인을 사용하려면 먼저 이클립스의 Help >> Install New Software… 이동하여 m2eclipse 플러그인을 설치한다. m2eclipse 플러그인의 update url 은 http://m2eclipse.sonatype.org/sites/m2e 이다.

[ m2eclipse 플러그인을 설치하는 화면 ]


2. 프로젝트 생성
m2eclipse 플러그인을 설치하면 이클립스에서 메이븐 프로젝트를 생성하는 것이 가능하다. File >> New >> Project로 이동한 후 Maven 메뉴로 이동한 후 “Maven Project”를 선택한다.

[ 메이븐 프로젝트를 생성하는 화면 ]

위의 그림을 보면 버전 관리 시스템에 존재하는 프로젝트를 메이븐 프로젝트로 체크아웃하는 기능(Checkout Maven Projects from SCM)부터 여러 개의 모듈을 관리할 수 있는 기능(Maven Module)까지 제공하고 있다. 여기에서는 프로젝트를 생성하기 위하여 “Maven Project” 메뉴를 선택하고 “Next” 버튼을 선택한다.


[ 프로젝트 생성 경로를 선택하는 화면 ]

위의 화면에서의 기본 설정은 “Create a simple project(skip archetype selection)”이 체크되어 있지 않은 상태이다.

기본 설정으로 다음 단계로 넘어가면 아키타입의 대화식 모드를 이용하여 프로젝트를 생성하는 과정이 나온다. 메이븐에서 기본으로 제공하는 아키타입을 이용하여 프로젝트를 생성할 경우 불필요한 소스 코드를 제거하고 JUnit 의존 관계 설정을 제거해야 한다. 특히 maven-archetype-webapp 아키타입의 경우 소스 폴더가 자동으로 생성되지 않아 추가적으로 생성해야 하는 불편함이 있다.

이 같은 불편함을 없애고 단순히 메이븐 기본 디렉토리를 포함하는 프로젝트를 생성하고 싶다면 위의 그림과 같이 “Create a simple project(skip archetype selection)”를 체크한 후 “Next” 버튼을 누르고 프로젝트와 관련한 정보를 입력한다.


[ 위키북 프로젝트에 대한 기본 정보를 입력하는 화면 ]

위의 그림에서 보는 바와 같이 위키북 프로젝트에서 사용할 Group Id, Artifact Id, Version, Packaging을 입력하고 Finish 버튼을 눌러 프로젝트를 생성한다.

[ m2eclipse 플러그인을 활용하여 생성한 위키북 프로젝트 ]
m2eclipse 플러그인을 기반으로 프로젝트를 생성할 경우 위의 그림에서 보는 바와 같이 기본 디렉토리를 가지는 템플릿 프로젝트가 생성된다. 위키북 프로젝트의 pom.xml 파일을 열어보면 위에서 입력한 정보를 제외하고는 아무런 설정 정보도 추가되어 있지 않다.
<project ...>
  <modelVersion>4.0.0</modelVersion>
  <groupId>net.javajigi</groupId>
  <artifactId>wikibook</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>wikibook</name>
</project>


3. m2eclipse 플러그인 저장소 설정
m2eclipse 플러그인을 설치하면 위의 그림에서 볼 수 있듯이 pom.xml 파일과 프로젝트의 좌측 상단에 푸른색으로 “M”자가 표시된다. 이는 m2eclipse 플러그인이 메이븐 기본 설정 파일을 인식한다는 뜻이다.

m2eclipse 플러그인을 설치하면 M2_REPO Classpath Variables를 자동으로 추가한다. m2eclipse 플러그인을 설치한 후 Window >> Perferences >> Java >> Build Path >> Classpath Variable메뉴로 이동해 보면 그림 6-18과 같이 M2_REPO가 “non modifiable”로 추가되어 있는 것을 알 수 있다.

[ m2eclipse 플러그인을 설치한 후의 M2_REPO 설정 ]

M2_REPO 변수를 m2eclipse 플러그인이 관리하고 있기 때문에 수정할 수 없는 상태로 관리된다. 위의 그림에서 확인할 수 있듯이 M2_REPO 값은 기본 로컬 저장소인 USER_HOME/.m2/repository 값으로 설정된다. 만약 로컬 저장소를 변경해서 사용하고 있다면 다음과 같이 로컬 저장소를 변경해야 한다.

먼저 테스트를 위하여 USER_HOME/.m2/settings.xml 파일의 로컬 저장소 설정을 다음과 같이 “D:\m2\repository” 디렉토리로 설정한다.

# 로컬 저장소를 D:\m2\repository 디렉토리로 설정하는 settings.xml 파일
<settings ...>
<localRepository>D:\m2\repository</localRepository>
[...]
</settings>

기본 로컬 저장소를 사용하지 않으면 먼저 Window >> Perferences >> Maven >> User Settings 메뉴로 이동한 후 Update Settings 버튼을 클릭한다.

[ m2eclipse 플러그인에서 로컬 저장소의 경로를 변경하는 화면 ]

Update Settings 버튼을 클릭하면 Local Repository의 값이 위의 그림과 같이 “D:\m2\repository”로 변경된다. Update Settings 버튼을 클릭할 경우 Local Repository의 값이 바로 반영되지 않는 경우가 있다. 이 때는 다른 메뉴에 접근한 후 다시 User Settings 메뉴로 이동해보면 settings.xml 파일에 설정한 로컬 저장소로 반영되어 있는 것을 확인할 수 있다.

로컬 저장소의 경로를 변경할 경우 Window >> Perferences >> Java >> Build Path >> Classpath Variable 메뉴에 설정되어 있는 M2_REPO도 변경해야 한다. M2_REPO의 값을 새로 설정한 로컬 저장소로 변경하려면 앞의 과정을 통하여 로컬 저장소를 변경한 후 이클립스를 재시작해야 하면 자동으로 반영된다.


4. m2eclipse를 활용한 메이븐 실행

m2eclipse를 설치한 다음 pom.xml 파일에서 오른쪽 클릭 >> Run As로 이동하면 메이븐에서 자주 사용하는 페이즈와 골을 실행할 수 있다. m2eclipse를 활용하여 메이븐 명령을 실행하려면 먼저 USER_HOME\.m2 디렉토리에 settings.xml 파일을 생성해야 한다. 루트 엘리먼트(<settings/>)를 가지는 settings.xml 파일을 생성하거나 MAVEN_HOME\conf 디렉토리의 settings.xml 파일을 복사한다.

[ m2eclipse에서 실행 가능한 페이즈와 Goal ]
위의 그림을 보면 clean, install, package등 자주 사용하는 메이븐 페이즈를 실행할 수 있도록 지원하고 있다. 만약 Run As 메뉴에서 기본으로 제공하지 않는 페이즈나 골을 실행하려면 위의 그림에서 “Maven build...”을 실행한다. “Maven build...”을 실행하면 명령 프롬프트에서 메이븐을 실행할 때와 똑같이 특정 플러그인의 골을 직접 입력해 실행할 수 있다.

[ m2eclipse로 메이븐을 빌드하는 화면 ]

이 기능을 활용하면 명령 프롬프트에서 빌드할 필요없이 이클립스에서 메이븐을 빌드할 수 있다. 이클립스에서 명령 프롬프트로 이동하지 않아도 되므로 유용하다.

메이븐을 빌드할 때마다 이전에 빌드했던 “eclipse:clean eclipse:eclipse”를 입력하는 것도 귀찮은 작업이 된다. 이클립스는 이전에 실행한 모든 명령들에 대한 이력을 관리한다. m2eclipse에서 실행한 결과는 Run >> Run History메뉴나 이클립스 상단의 단축 아이콘으로 접근할 수 있다.

[ 이전 m2eclipse 빌드 이력을 보는 화면 ]

<참고사항>
내가 m2eclipse를 즐겨 사용할 때는 메이븐 기반 프로젝트를 빌드하기 위하여 자주 사용하는 명령어를 등록해 사용했다. 예를 들어 다음과 같이 명령어를 등록해 사용할 수 있다.
 wikibook for eclipse(이클립스 기반 프로젝트로 전환) : eclipse:clean eclipse:eclipse
 wikibook for build(프로젝트 빌드) : clean test

프로젝트의 빌드 상태에 따라서는 특정 Goal을 실행해야 하는 상황이 발생할 수 있기 때문에 자주 사용하는 페이즈와 골 조합을 위와 같이 등록해 사용하면 유용하다.
</참고사항>


5. m2eclipse를 활용한 설정 파일 및 의존 관계 관리

m2eclipse 플러그인을 활용할 때 유용하게 사용할 수 있는 기능이 지금까지 명령 프롬프트상에서 명령을 실행하고 결과물을 확인했던 내용을 이클립스에서 명령어를 몰라도 좀 더 좋은 UI를 통해 확인할 수 있다는 것이다.

메이븐 기반 프로젝트에서 pom.xml 파일을 더블 클릭하면 pom.xml 파일의 소스 코드가 바로 나타나지 않고 Overview 화면이 기본으로 열리며, 여러 개의 탭 화면을 가지는 것을 확인할 수 있다. 이 각각의 탭 중에서 유용하게 사용할 수 있는 몇 가지 기능에 대하여 살펴보도록 하겠다.

첫째, Dependencies 탭은 해당 프로젝트와 의존 관계에 있는 라이브러리를 관리할 수 있도록 지원한다. 5장에서 http://mvnrepository.com/ 사이트에 접속해 라이브러리를 검색하고 추가하던 작업을 m2eclipse를 활용해 가능하다.

[ Dependencies 탭에서 spring-core 라이브러리를 추가하는 화면 ]























2014년 2월 26일 수요일

Maven Lifecycle 이란

Maven Lifecycle

1. Maven Lifecycle 이란

  • Maven에서는 clean, build, site의 세 가지 Lifecycle을 제공하고 있다.
  • 컴파일(compile), 테스트(test), 패키지(package), 배포(depooy)등의 과정은 빌드 Lifecycle에 속한다.
  • Maven은 모든 빌드 단위에 대한 Lifecycle이 예약되어 있어서 개발자가 임의로 변경 할 수 없다.
  • 각 Lifecycle은 순서를 갖는 단계(phase)로 구성된다.
  • Maven의 기본 Lifecycle을 이해하려면 Phase와 Goal의 개념을 이해해야 한다.




2. Phase와 Goal



2.1 Phase

  • Phase는 Build Lifecycle의 각각의 단계를 의미 한다.
  • Phase는 특정 순선에 따라서 goal이 실행되도록 구조를 제공 한다.
  • Phase 간에는 의존 관계가 있다.
    예를 들어 package phase가 수행되기 위해서는 이전 phase가 순서대로 수행된 다음에 실행된다.


2.2 Goal

  • Goal은 Ant의 Target과 같은 개념으로 생각하면 된다.

2.3 Phase와 Goal의 관계

  • Maven에서 제공하는 모든 기능은 플러그인 기반으로 동작한다.
  • Maven에서 기본으로 제공하는 Phase를 실행하면 해당 Phase와 연결된 플러그인의 Goal이 실행된다.
  • 각 phase는 0개 이상의 goal과 바인드 되어 있으며, 대부분 0또는 1개 이상의 Goal이 바인드 되어 있다.
  • Plugin Goal
    • Maven에서 플러그인을 실행할 때 '플러그인이름:플러그인지원골'의 형식으로 실행 할 기능을 선택 할 수 있다.
    • 예를들어 mvn compiler:compile은 'compiler' 플러그인에서 'compile' 기능(goal)을 실행한다는 것을 뜻 한다.
  • 아래는 package phase가 실행되기 전에 완료되야 하는 phase와 Goal이다.
PhaseGoal
[ resources:resources ]resources
[ compiler:compile ]compile
[ resources:testResources ]test-resources
[ compiler:testCompile ]test-compile
[ surefire:test ]test
[ jar:jar ]package
[표] 디폴트 라이프사이클의 주요 단계(phase)
 단계설명단계에 묶인 플러그인 실행
generate-sources컴파일 과정에 포함될 소스를 생성한다. 예를 들어,  DB 테이블과 매핑되는 자바 코드를 생성해주는 작업이 이 단계에서 실행된다.
process-sources필터와 같은 작업을 소스 코드에 처리한다. 
generate-resources패키지에 포함될 자원을 생성한다. 
process-resources필터와 같은 작업을 자원 파일에 처리하고, 자원 파일을 클래스 출력 디렉토리에 복사한다.resources:resources
compile소스 코드를 컴파일해서 클래스 출력 디렉터리에 클래스를 생성한다.compiler:compile
generate-test-sources테스트 소스 코드를 생성한다. 예를 들어, 특정 클래스에서 자동으로 테스트 케이스를 만드는 작업이 이 단계에서 실행된다.
process-test-sources필터와 같은 작업을 테스트 소스 코드에 처리한다.resources:testResources
generate-test-resources테스트를 위한 자원 파일을 생성한다. 
process-test-resources필터와 같은 작업을 테스트 자원 파일에 처리하고, 테스트 자원 파일을 테스트 클래스 출력 디렉터리에 복사한다. 
test-compile테스트 소스 코드를 컴파일해서 테스트 클래스 추력 디렉터리에 클래스를 생성한다.compiler:testCompile
test테스트를 실행한다.surefire:test
package컴파일 된 코드와 자원 파일들을 jar, war와 같은 배포 형식으로 패키징한다.패키징에 따라 다름
jar - jar:jar
war - war:war
pom - site:attach-descriptor
ejb - ejb:ejb
install로컬 리포지토리에 패키지를 복사한다.install:install
deploy생성된 패키지 파일을 원격 리포지토리에 등록하여, 다른 프로젝트에서 사용할 수 있도록 한다.deploy:deploy


3. Maven 디폴트 Phase와 Goal

process-resources

  • resources:resources Goal이 실행 된다.
  • Maven Resources Plugin
  • <resource> directory(/src/main/resources)를 <outputDirectory>에 생성 한다.

compile

  • resources:resources, compiler:compile Goal이 실행 된다.
  • Maven Compiler Plugin
  • 소스 코드를 컴파일해서 클래스를 <outputDirectory>에 생성 한다.

test-compile

  • compiler:compile, compiler:testCompile Goal이 실행 된다.
  • 테스트 소스 코드를 컴파일 한다.

test

  • compiler:compile, compiler:testCompile, surefire:test Goal이 실행 된다.
  • Maven Surefire Plugin
  • junit과 같은 테스트 코드를 실행, 테스트가 실패하면 빌드를 멈춘다
  • target/surefie-reports디렉토리 안에 test 리포트 파일을 생성한다
  • 단위 테스트 코드가 깨져도 빌드를 성공시키려면 maven.test.skip 속성을 true로 설정하면 된다.
    <properties>
            <maven.test.skip>true</maven.test.skip>
    </properties>       
     

package

  • package를 실행하면 compile, test-compile, test 순으로 실행된 다음 jar, war파일이 target 디렉토리 아래에 생성된다.
  • 패키징에 따라 아래의 플러그 인을 사용한다.
  • Maven Jar Plugin
  • Maven WAR Plugin
  • Maven EAR Plugin

install

deploy

  • 원격 리파지토리에 등록하여, 다른 프로젝트에서 사용 할 수 있도록 한다.
  • Maven Deploy Plugin

clean

Reference

문서정보

Maven 핵심개념 - Plugin,Goal,Phase,생명주기

원문 : http://demon92.tistory.com/14

1. Plugin,Goal

이번글에서는 maven에 관련된 몇가지 개념과 maven 생명주기에 대해서 정리해본다.
이전(http://demon92.tistory.com/12) 글에서 아래의 명령으로 기본적인 프로젝트를 생성했다

mvn archetype:generate -> archetype은 plugin, generate는 Goal이다.
단순하게 말해서 Maven은 설치만 해서는 아무것도 못한다. 즉 maven은 자체로는 아무런 처리능력이 없다. 몇개의 XML 문서를 파싱하고 생명주기와 몇가지 플러그인의 추적을 유지하는 것 이외에는 어떻게 처리할지 모른다.
maven으로 의미있는 작업을 하기위해서는 Plugin을 다운 받아야 한다.(명령을 실행하면 자동적으로 다운을 받는다).  Maven은 대부분의 책임을 maven 생명주기에 영향을 주고 goal에 대한 접근을 제공하는 Plugin에 위임하도록 되어 있다. Plugin은 여러개의 Goal를 가지고 있고 Goal은 Plugin에 포함되어 있는 명령이다. 즉 Maven의 Plugin은 하나이상의 Goal의 집합체이다. 

 
그럼 Goal은?  goal은 Maven에서 단위 작업 즉 명령이라고 생각하면 된다. 
소스코드를 compile하는 compiler Plugin의 compile goal 또는 단위 테스트를 실행할수 있는 Surefire Plugin의 test goal를 들수 있다. 아울러 goal은 기능을 변경하는데 사용될 수 있는 설정 속성을 설정된다.
예를 들면 Compiler plugin의 compile goal은 대상 JDK버전을 지정할수 있다 뒤에 이 부분은 다시 다룬다.

2. Phase

Phase를 이야기하기 전에 maven의 Lifecycle에 대해 간단히 알아보면 Maven Lifecycle은 프로젝트를 
빌드하는데 관련된 순차적인 단계들이다 ( maven defaule lifecycle(http://demon92.tistory.com/2) 참고)
Maven은 수많은 생명주기를 지원하지만 가장 자주 사용되는것은 기본 Mavne 생명주기로 프로젝트의 기본적인 통합을 검증하는 단계로 시작해서 제품으로 프로젝트를 배포하는 것과 관련된 단계로 끝난다.
                
            

Phase는  maven의 Build Lifecycle의 한부분으로 각각의 Phase는 어떤 일을 할지 정의하지 않고 어떤 Goal을 실행할지 설정한다. 즉 Plugin의 goal은 생명주기 단계에 붙을수 있다
package Phase에서 Jar Plugin의 jar goal를 실행한다.        
        

각각의 Phase는 그 안에 0개이상의 goal를 가질수 있다  package Phase는 jar packaging과 같은 프로젝트의 jar 파일을 생성하는것으로 알고 있지만 maven은 생명주기의 특정 Phase가 실행이 되면 그 이전의 
모든 Phase를 순차적으로 모두 수행한다.  즉 mvn package를 실행할때 maven은 package단계까지 모든 Phase를 실행하고 생명주기 Phase를 거치는 과정에서 해당 Phase에 속한 모든 goal들을 실행한다. 
(아래 그림 참조)

mvn package를 실행하는 대신에 다음과 같이 일련의 plugin goal들을 지정함으로써 동일한 결과를 얻을수 있다
mvn resources:resources compiler:compile resource:testResources compiler:testCompile surefire:test jar:jar