이 내용은 박재성님이 집필하신 [자바 세상의 빌드를 이끄는 메이븐] 책을 그대로 정리한 것이다.
회사에서 스터디를 하는데 문서 보안 때문에 어쩔수 없이 블로그를 이용하게 되었고,
위 내용은 박재성님의 허락을 받았습니다.

4 메이븐 라이프 사이클
 1) 메이븐의 라이프사이클과 페이즈
  - 일반적으로 프로젝트 빌드 과정을 보면 빌드 결과물 삭제, 컴파일에 필요한 자원 복사, 소스 코드 컴파일, 테스트, 압축(패키지), 배포
    과정을 거침. 메이븐도 비슷하지만 한가지 다른점이 있다면 빌드 단계를 미리 정하고 있다는 점
  - 메이븐은 미리 정의하고 있는 빌드 순서를 라이프 사이클이라 하며, 라이프 사이클의 빌드 단계를 페이즈라 함
  - 메이븐은 3개의 라이프 사이클을 제공
   . 소스 코드 컴파일, 테스트, 압축, 배포를 담당하는 기본 라이프 사이클
   . 빌드한 결과물을 제거하기 위한 clean 라이프 사이클
   . 프로젝트 문서 사이트를 생성하는 site 라이프 사이클
   . 그림 1 참조 : 기본 라이프 사이클은 중심이 되는 페이즈만 표시
[그림1]


  가. 기본 라이프 사이클
   - 소스 코드 컴파일, 테스트, 압축, 배포와 같은 일련의 작업을 모두 실행
   - compile : 소스 코드를 컴파일
   - test : JUnit, TestNG와 같은 단위 테스트 프레임워크로 단위테스트 함, 기본 설정은 단위 테스트가 실패하면 빌드 실패
   - package : 단위 테스트가 성공하면 pom.xml의 packaging 값 jar, war, ear에 따라 압축
   - instal : 로컬 저장소에 압축한 파일을 배포
   - deploy : 원격 저장소에 압축한 파일을 배포. 외부에 위치한 메이븐 저장소를 의미. 뒷장에서 설명
   - 최종 빌드 순서는 compile, test, package 페이즈 순으로 빌드가 진행됨
  나. clean 라이프 사이클
   - clean 페이지를 이용하여 실행, 메이븐 빌드를 통하여 생성된 모든 산출물을 삭제
     메이븐은 기본으로 모든 산출물을 target 디렉토리에 생성하는데, 이 디렉토리를 삭제
  다 site 라이프 사이클
   - site, site-deploy 페이즈를 이용하여 실행
   - mvn site 를 실행하면 메이븐에 설정되어 있는 기본 설정, 플러그인 설정에 따라 target/site 디렉토리에 문서 생성
   - site-deploy 페이즈는 생성한 문서 사이트를 설정되어 있는 서버에 배포
 2) 메이븐 페이즈와 플러그인
  가. 메이븐 플러그인
   - 메이븐에 사용하고자 하는 플러그인이 있다면 다음과 같이 설정
    <build>
     <plugins>
  <plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>2.1</version>
  </plugin>
 </plugins>
    </build>
   - build/plugins/plugin 엘리먼트 아래에 사용하고자 하는 플러그인의 groupId, artifactId, version을 설정
     위 소스 코드는 compiler 플러그인을 사용하기 위한 설정
   - 메이븐은 하나의 플러그인에서 여러 작업을 수행할수 있으며, 플러그인에서 실행할수 있는 각각의 작업을 골(goal)이라 정의
     예를 들어 compiler 플러그인은 하나지만 sourceDirectory의 소스 코드를 컴파일하는 compile골, testSourceDirectory의
     테스트 소스 코드를 컴파일 하는 testCompile 골, compiler 플러그인에 대한 도움말을 제공하는 help 골
   - mvn groupId:artifactId:version:goal
     mvn org.apache.maven.plugins:maven-compiler-plugin:2.1:compile
   - 메이븐 플러그인은 $name:goal 형태로 실행 할수 있음 예)compiler:compile
     메이븐이 기본적으로 플러그인 그룹 목록에 org.apache.maven.plugin와 org.codehaus.mojo를 가지고 있음
  나. 페이즈와 플러그인의 관계
   - 메이픈에서 페이즈는 빌드 라이프사이클에서 빌드 단계와 각 단계의 순서만을 정의하고 있는 개념.
     실질적인 빌드 작업은 각 페이즈에 연결되어 있는 플러그인 골이 함
     mvn compile 명령은 compile 페이즈를 실행한 것, compile 페이즈를 실행하면 실질적인 컴파일 작업은 compile 페이즈와 연결되어
     있는 compiler 플러그인의 compile 골이 실행됨
     



   - 메이븐 기본 페이즈와 골 간의 관계
     



   - 기본 페이즈에 대한 플러그인 정보는 메이븐이 이미 알고 있음으로 추가 설정없이 페이즈를 실행하면 플러그인을 자동으로 다운로드
     예를 들어 compile 페이즈를 실행하면 메이븐 중앙 저장소에서 compiler 플러그인을 자동으로 다운로드 해서 컴파일을 진행
     mvn test 를 실행 해서 확인
 3) 메이븐 기본 페이즈와 플러그인
  가 자원 복사 및 소스 코드 컴파일
   - process-resources 와 cpmpile 페이즈
   - mvn compile 페이즈를 실행하면 먼저 의존 관계에 있는 process-resources 페이즈가 실행
     process-resource 페이즈에서는 resources 플러그인의 resources 골이 먼저 src/main/resources 디렉토리에 있는 모든 자원을
     target/class 디렉토리로 복사. pom.xml에 <resources/> 엘리먼트를 재정의 했을 경우 재정의한 규칙에 따라 자원을 복사
   <project ...>
   [.... 생략...]
   <build>
 <resources>
  <resource>
   <directory>src/main/resources</directory>
  </resource>
  <resource>
   <directory>src/main/java</directory>
   <excludes>
    <exclude>**/*.java</exclude>
   </excludes>
  </resource>
 </resources>
    </build>
    [.... 생략 ...]
    </project>
   - ibatis 같은 설정파일이나 메시지 설정 파일을 /src/main/resources 보다는 소스와 같은 src/main/java에서 관리할때가 더 유용
     그래서 위의 파일처럼 *.java 파일을 제외하고 target/classes 디렉토리로 복사
   - process-resources 페이즈 실행 완료후, compile 페이즈와 연결된 compiler 플러그인의 compile골(compiler:compile)이
     src/main/java디렉토리의 자바 소스 코드를 target/classes 디렉토리로 컴파일
     compile 페이즈는 src/main/java 디렉토리의 소스 코드만 컴파일
   - mvn compile 실행
     


   - 자바 소스 코드를 컴파일할때 컴파일러의 버젼, 자바 소스 코드의 인코딩 설정은 compiler 플러그인에서 설정
     없을 경우 최상위 POM에 설정된 compiler 플러그인 설정을 따름
   <project ...>
   [.... 생략...]
   <build>
 <plugins>
  <plugin>
   <artifactId>maven-compiler-plugin</artifactId>
   <configuration>
    <source>1.5</source> ............ 컴파일 되는 소스 파일 jdk 버젼
    <target>1.5</target> ............ 클래스 파일이 동작하게 될 jdk 버젼
    <encoding>utf-8</encoding>
   </configuration>
  </plugin>
 </plugins>
    </build>
    [.... 생략 ...]
    </project>  
   추가 설명은 뒷장에서
  나. 테스트 자원 복사 및 테스트 소스 코드 컴파일
   - src/test/resources 디렉토리의 자원복사는 process-test-resources 페이즈, src/test/java 컴파일은 test-compile 페이즈에서 진행
   - test-compile 페이즈는 compile 페이즈와 같이 process-test-resources 페이즈를 실행해 src/test/resources 디렉토리의 자원을 먼저
     복사한후 테스트 소스 코드를 컴파일
     mvn test-compile 실행
   - src/test/java 디렉토리에 있는 모든 소스 코드는 src/main/java 디렉토리에 있는 소스코드와 의존 관계에 있음
     이 소스 코드를 컴파일 하지 않은 상태에서 테스트 소스 코드는 컴파일 할수 없음, 따라서 test-compie 페이즈를 실행하면 compile
     페이즈를 먼저 실행해 src/main/java 디렉토리의 소스 코드를 컴파일
   - test-compile 페이즈를 실행하면 compiler 플러그인의 testCompile 골이 실행
     위의 예제에서 처럼 testCompile을 실행하기 전에 compiler:compile을 실행하고 src/test/resources 에 있는 자원을 target/test-classes 디렉토리에 복사
  다. 테스트 하기
   - 테스트 소스 코드를 컴파일 후 테스트 하는 것이 test 페이즈
     mvn test
     



   - 테스트 페이즈는 target/test-classes에 컴파일한 단위 테스트 클래스를 실행하고 그 결과물을 target/surefire-reports 디렉토리에 생성
     test-compile 페이즈에 의존 관계를 가짐
   - 특정 테스트 스위트(TestSuite)별로 나누어서 테스트 하고 싶을때
     mvn -Dtest=AllUnitTests test
     mvn -Dtest=AllUnitTests, AllIntegrationTests test
   - 단위 테스트가 실패하면 빌드를 실패하여 다음 단계로 진행할수 없음, 단위 테스트를 실행하지 않도록 설정
     mvn -Dmaven.test.skip=true test
     이렇게 maven.test.skip=true를 인자로 전달하기 싫은 경우 pom.xml의 <properties/>엘리먼트에 maven.test.skip 설정 추가
    <project ...>
 <properties>
  <maven.test.skip>true</maven.test.skip>
 </properties>
    </project>
    test 페이즈에 연결되어 있는 surefire 플러그인에서 설정도 가능
    [... 생략...]
    <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <version>2.5</version>
 <configuration>
  <skipTests>true</skipTests>
 </configuration>
    </plugin>
    [... 생략 ...]
    이 경우 단위 테스트를 실행하지 않으므로 일부 단위 테스트가 실패하더라도 다음 단계의 빌드를 실행하도록 surefire 플러그인 설정할수 있음
    [... 생략...]
    <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-surefire-plugin</artifactId>
 <version>2.5</version>
 <configuration>
  <testFailureIgnore>true</testFailureIgnore>
 </configuration>
    </plugin>
    [... 생략 ...]
    surefire 플러그인은 junit4에서만 가능, testNG 에 관한것은 다른 책 참조 ㅋ.ㅋ 귀찮음
  라. 패키징하기
   - pom.xml의 <packaging/>엘리먼트에 설정한 값으로 압축할때 사용하는 페이즈
     mvn package
     compile, test-compile, test.package 순으로 실행된후 jar, war 파일이 target 디렉토리에 생성, 압축 파일의 명명 규칙은
     <build>/<finalName>엘리먼트 값이 설정되어 있을 경우
     ${finalName}.${packaging} 형태로 압축 파일이 생성, 없을 경우
     ${artifactId}-${version}.${packaging} 이 압축 파일 이름이 됨
     target 디렉토리에 생성되는 디렉토리 명도 위의 규칙과 동일 finalName이 있을 경우 target/${fnailName} 디렉토리가 생성
     없을 경우 target/${artifactId}-${version} 디렉토리가 생성
  마. 배포하기
   - 메이븐은 실행하는 컴퓨터의 로컬 저장소에 압축한 jar, war 파일을 배포하는 방식과 원격 저장소에 배포하는 두가지 방식이 있음
   - mvn install
     로컬 저장소에 배포할 때 사용하는 install 페이즈
     package 페이즈와 의존 관계에 있음, install 페이즈를 실행하기 전에 package 페이즈를 실행해 압축을 완료한 다음 로컬 저장소에 배포
     C:\Users\jeongdae\.m2\repository\com\samsunglife\webzine\1.0-SNAPSHOT
   - 다른 개발자들과 jar,war 파일을 공유하려면 로컬에서 압축한 jar,war 파일을 외부에 있는 메이븐 저장소에 배포
     mvn deploy
     jar, war 파일을 원격 저장소에 등록하는 역할, deploy 페이즈는 install 페이즈와 의존 관계
     compile, test-compile, test, package, install, deploy순으로 의존 관계가 있음
  바. 빌드 결과물 제거하기
   - target 디렉토리의 결과물을 모두 제거하고 처음부터 새롭게 빌드할수 있는 clean 페이즈 제공
     install 한 작업은 제거하지 않음
     mvn clean
     다른 페이즈와 의존 관계가 없음, 다른 페이즈를 실행해도 실행되지 않음
     clean 페이즈를 실행하지 않을 경우 이전에 빌드했던 산출물 중에서 불필요한 산출물이 남아있어 에러가 발생할수 있음
     다른 페이즈를 실행하기 전에 항상 clean을 실행하는 습관을 가져야 함
     mvn clean test ................. target 디렉토리 삭제후 test 페이즈 실행
     mvn clean install

Posted by gt1000

블로그 이미지
gt1000

태그목록

공지사항

어제
오늘

달력

 « |  » 2024.3
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함