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 Plugins

Maven Plugins

1. Maven Plugin

  • 플러그인은 Maven의 핵심 기능으로 Goal이라는 실행 단위들의 집합으로 구성되어 있다.

기본적인 plugin 설정

  • 플러그인 정보는 build 엘리먼트의 plugins 엘리먼트 안에 설정한다.
  • 플러그인을 등록할 때 groupId가 생략된 경우도 있다. 기본으로 org.apache.maven.plugins 와 org.codehaus.mojo 는 생략해도 된다
    <plugins>
     ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
      ..
    </plugins>
    
  • 아래와 같이 라이프사이클의 일부로 특정 Goal을 추가하고 설정 할 수 있다.
     
    <plugins>
     ...
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <configuration>
         <tasks>
           <echo>The JAVA_HOME var is ${env.JAVA_HOME}</echo>
         </tasks>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>run</goal>
            </goals>
            <phase>compile</phase>
          </execution>
        </executions>    
      </plugin>
      ..
    </plugins>
    
  • default lifecycle phase를 사용하는 예제
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
        <execution>
          <id>copy-dependencies</id>
          <!-- Binds by default to the lifecycle phase: process-sources.  -->
          <goals>
            <goal>copy-dependencies</goal>
          </goals>
          <configuration>
            <excludeArtifactIds>servlet-api,jsp-api</excludeArtifactIds>
            <outputDirectory>${basedir}/web/WEB-INF/lib</outputDirectory>
            <overWriteReleases>false</overWriteReleases>
            <overWriteSnapshots>true</overWriteSnapshots>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

2. Maven Plugins

문서정보

Maven Profiles - 서로 다른 빌드 환경간의 이식

Maven Profiles

  • Maven에 있는 Profile의 사용 목적은 서로 다른 빌드 환경간의 이식성 이다.

Profile 간단 사용 예제

  • profile 설정 간단 예제
<profiles>
  <profile>
    <id>local</id>
    <properties>
        <env>local</env>
    </properties>            
  </profile>
  <profile>
    <id>alpha</id>          
    <properties>
        <env>alpha</env>
    </properties>
  </profile>
  <profile>
    <id>beta</id>
    <properties>
        <env>beta</env>
    </properties>
  </profile>
  <profile>
    <id>release</id>
    <properties>
        <env>release</env>
    </properties>
    
    <activation>
        <property>
            <name>bds</name>
            <value>false</value>                    
        </property>                
    </activation>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.5</source>
                    <target>1.5</target>                    
                    <debug>true</debug>
                    <optimize>true</optimize>
                    <encoding>utf-8</encoding>
                    <showDeprecations>true</showDeprecations>
                    <fork>true</fork>                            
                    <executable>/usr/local/env/java/jdk1.5.0_10/bin/javac</executable>
                </configuration>
            </plugin>
        </plugins>
    </build>
  </profile>
  ..
</profiles>  

<properties>
    <env>local</env>
    <bds>false</bds>
    <clover.home>analysis_tools/clover</clover.home>
    <checkstyle.home>analysis_tools/checkstyle</checkstyle.home>
    <pmd.home>analysis_tools/pmd</pmd.home>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>      
</properties>

  • 실행시 profile 옵션을 사용한다 (ex. mvn package -Palpha)
  • 실행위치의 pom.xml, 실행위치의 profiles.xml, $USER_HOME/settings.xml, $M2_HOME/conf/settings.xml 순으로 profile 항목을 찾는다.
  • profile의 id 가 동일한 경우가 나타나면 해당 profile 에서 선언된 내용을 적용한다.
    즉 사용자 정의 환경변수 env 의 값이 alpha로 변경 됨.
  • mvn -Palpha는 mvn -Denv=alpha 로 변경 사용.

Profile activation의 사용

  • activation 엘리먼트는 오직 profile 엘리먼트 내부에서만 사용할 수 있다.
  • 정의한 환경과 실행 환경이 일치하면 profile에 설정한 값들이 project에 설정한 값에 대체 한다.
  • mvn -Ddeploy=true 실행시 아래 activation 수행 됨
     
    <profiles>
    
    <profile>
      <activation>
        <property>
            <name>deploy</name>
            <value>true</value>
        </property>
      </activation>
      <build>
        <plugins>       
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <mkdir dir="../webapps" />
                                <copy todir="../webapps" overwrite="true" preservelastmodified="true">
                                    <fileset  dir="${basedir}/web">
                                        <include name="**/*" />
                                    </fileset>
                                </copy>
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>        
        </plugins>
      </build>
    </profile>
    </profiles>        
    

문서정보

Maven Properties - 동적인 환경구성

Maven Properties

  • pom.xml 파일에서 maven 프로퍼티를 사용하여 동적인 환경 구성이 가능하다.
  • 프로퍼티의 종류에는 project 프로퍼티, settings 프로퍼티, 환경 변수 프로퍼티, Java System 프로퍼티, 사용자 정의 프로퍼티가 있다.

1. Maven Project Properties

  • Maven Project Object Model(pom.xml) 에 정의된 값.
  • prefix. : project.*
        ex) ${project.build.outputDirectory}
      
<dependencies>
  <dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>sibling-project</artifactId>
    <version>${project.version}</version>
  </dependency>
</dependencies> 
 

2. Maven Settings Properties

3. Environment Variable Properties

  • 환경 변수 값을 참조 할 수 있다.
  • prefix : env.*
  • 예제
    • env.PATH : 현재의 PATH 정보
    • env.JAVA_HOME : JDK Home 정보
    • env.HOME : 유닉스/리눅스 사용자 HOME 디렉토리
    • env.M2_HOME : Maven Home 정보
<!-- mvn antrun:run -->
<plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <configuration>
    <tasks>
      <echo>The JAVA_HOME var is ${env.JAVA_HOME}</echo>
    </tasks>
  </configuration>
</plugin>

<!--  [echo] The JAVA_HOME var is C:\jdk1.5 출력된다. -->

4. Java System Properties

  • System.getProperty() 메소드에서 제공하는 모든 프로퍼티 정보를 참조할 수 있다.
Java System Properties설명
java.versionJRE의 버전
java.vendorJRE의 vendor 정보
java.homeJDK 또는 JRE의 설치 디렉토리
java.vm.specification.versionJVM SPEC 버전
java.vm.specification.nameJVM SPEC 이름
os.nameOS 이름
os.versionOS 버전
user.home사용자 홈 디렉토리
user.name사용자 이름
user.dir현재 디렉토리

5. User-defined Properties

  • 아래와 같이 직접 정의해서 사용 할 수 있다.
<project>
...
<properties>
  <env>local</env>
  <clover.home>analysis_tools/clover</clover.home>
  <checkstyle.home>analysis_tools/checkstyle</checkstyle.home>
  <pmd.home>analysis_tools/pmd</pmd.home>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>      
</properties>
...
</project>

6. Reference

문서정보

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

문서정보