'java > spring' 카테고리의 다른 글

spring example  (0) 2014.12.15
임시메모  (0) 2014.10.20
JTA 샘플  (0) 2013.03.14
스프링 샘플  (0) 2013.01.16
메일 발송 관련 템플릿  (0) 2010.03.18
Posted by gt1000

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

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

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

3 메이븐 설정 파일
 - 메이븐을 사용하려면 알아야 할 두가지 설정 파일이 있음
   메이븐 빌드 툴과 관련한 설정 파일로 settings.xml
   메이븐 기반 프로젝트에서 사용하는 설정 파일로 이름은 기본적으로 pom.xml, 이름 변경 가능
 1) settings.xml
  - MAVEN_HOME/conf 디렉토리에 위치, 모든 사용자에게 동일한 설정 제공
  - 사용자 별로 설정을 원한다면
    C:\Documents and Settings\[현재로그인아이디]\.m2 디렉토리에 settings.xml 설정 가능, 복사가 좋음
  - 메이븐은 빌드할때 의존 관계에 있는 라이브러리, 플러그인을 중앙 저장소에서 개발자 pc로 다운로드
    다운로드한 라이브러리는 개발자 pc의 특정 디렉토리에 위치하게 되는데 이 디렉토리를 로컬 저장소라 부름
    로컬 저장소 기본 설정은
    C:\Documents and Settings\[현재로그인아이디]\.m2\repository  
    이 경로를 바꾸고 싶다면 다음과 같은 방법으로 변경
    MAVEN_HOME/conf 디렉토리의 settings.xml 파일을 열어서 <localRepository>가 주석 처리 된것을 확인
    주석을 제거한 다음 원하는 경로를 세팅
    <localRepository>D:\repositories\mavenRepository</localRepository>
 2) pom.xml
  - 프로젝트 객체 모델 Project Object Model
  - 메이븐은 pom.xml 을 읽어 빌드 실행, 다른 파일 설정을 사용하고 싶은 경우 -f 또는 --file 사용
  - > mvn -f mypom.xml test
  - 메이븐은 크게 4개의 카테고리로 구분(프로젝트 기본정보, 빌드설정, 프로젝트 관계 설정, 빌드 환경)
    


  가. 프로젝트 기본 정보
    프로젝트 이름, 프로젝트 url, 프로젝트에 참여하는 개발자 목록, 프로젝트의 라이센스 설명 생략
    - name : 프로젝트 이름
    - url : 프로젝트 사이트가 있다면 사이트 URL을 등록하는 것이 가능하다.
  나. 빌드설정
    - 메이븐 빌드와 관련된 기본적인 빌드 설정을 변경하기 위한 카테고리
      기본 소스 디렉토리나 리소스 디렉토리에 대한 변경, 플러그인 설정 변경, 새로운 플러그인 추가
      다양한 리포트 문서
  다. 프로젝트 관계 설정
    - 다른 라이브러리 또는 프로젝트와 의존 관계를 가지며, 각 프로젝트 사이에서 상속 관계를 가지는 경우도 있음
      이런 경우 각 프로젝트의 관계를 관리
  라. 빌드 환경
    - 모든 프로젝트는 다양한 환경에서 배포가 가능하며, 환경에 따른 변경 부분을 관리하는 카테고리
      메이븐에서는 다양한 환경을 지원할수 있도록 프로파일 기능을 제공, 뒤에 자세히 설명
  
   pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.samsunglife</groupId>
  <artifactId>webzine</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>webzine Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>webzine</finalName>
  </build>
</project>
 
  . project : 최상위 엘리먼트
  . modelVersion : POM 모델의 버전, 가장 최근 버젼은 4.0.0, POM 모델이 변경되지 않으면 수정할 필요가 없음
  . groupId : 프로젝트를 생성하는 조직의 고유 아이디를 결정, 일반적으로 도메인 이름을 사용
  . artifactId : 프로젝트를 식별하는 유일한 아이디를 의미
  . packaging : 프로젝트를 어떤 형태로 패키징 할지를 결정, jar, war, ear, pom 등이 있음
  . version : 프로젝트의 현재 버젼, 개발이 완료된 버전의 경우 1.0, 2.0 과 같이 사용, 프로젝트 개발 중에는
              SNAPSHOT을 접미사로 사용할수 있음. SNAPSHOT은 메이븐 예약어, SNAPSHOT을 사용하면 라이브러리를
              다른 방식으로 관리
  . name : 프로젝트 이름
  . url : 프로젝트 사이트가 있다면 사이트 url 을 등록
  . dependecies : <dependencies/> 엘리멘트와 하위 엘리멘트인 <dependency/>는 프로젝트와 의존 관계에 있는
                  라이브러리를 관리. 메이븐 저장소에서 JUnit 3.8.1 버젼을 PC에 다운
   
    - 메이븐은 중앙 저장소를 가지고 있으며, 모든 라이브러리를 관리해야 하기 때문에 groupId + artifactId 값이 유일한 값
 3) 최상위 POM 설정 파일
  - 기본적인 프로젝트 디렉토리 구조와 메이븐에서 할수 있는 기본적인 플러그인 정보를 포함하고 있는 최상위 POM 설정 파일을 제공
    최상위 설정 파일은 메이븐에 포함되어 있는 jar 파일을 통해 배포
  - 최상위 POM 파일은 우리가 생성하는 모든 메이븐 설정 파일의 부모 POM 역할을 하며, 모든 설정파일이 이 파일을 상속
    



  - 상속하고 있는 POM 파일의 내용을 확인 하려면
    mvn help:effective-pom
  - > D:\workspace-indigo\webzine>mvn help:effective-pom 실행
    [최상위 POM 파일]
        

      

  - 최상위 설정 파일 설정
   . 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
   . repositories : 빌드할때 접근할 저장소의 위치를 관리함. 메이븐 기본 저장소 url 은 http://repo1.maven.org/maven2
   . pluginManagement : 빌드 설정 과정에서 관리하는 플러그인 목록. 이 엘리먼트에 설정되어 있다고 반드시 사용되는 것은 아님
                       
  - 메이븐을 처음 사용하는 대부분의 개발자들은 최상위 POM에서 기본값을 정의하고 있기 때문에 메이븐 기반 프로젝트는 반드시 이
    구조를 따라야 함. 만약 최상위 POM에서 정의한 기본 설정을 변경하고자 한다면 하위 설정 파일에서 재 정의
  - 만약 src/main/java -> src/java 로 변경하고 싶다면
    <build>
        <finalName>webzine</finalName>
        <sourceDirectory>src/java</sourceDirectory>
        .... 생략 ....
    실습 해 보자
 4) 웹진 프로젝트 기본 디렉토리 설정 완료
  - war 프로젝트로 생성한 프로젝트는 웹 자원을 관리하는 디렉토리만 있고 자바 소스를 관리하는 디렉토리가 없음
    src 디렉토리 밑에 수동으로 자바 소스 디렉토리를 추가
    src/main/ 디렉토리 밑 java.com.samsunglife 추가
    src/ 디렉토리 밑에 test.java.com.samsunglifecom 추가
  - webapp 변경하는 예제
    src/main/webapp 를 webapp로 재 정의 하고 싶은 경우
    <build>
        <finalName>webzine</finalName>
        <plugins>
   <plugin>
   <artifactId>maven-war-plugin</artifactId>
   <configuration>
    <warSourceDirectory>webapp</warSourceDirectory>
   </configuration>
  </plugin>
 </plugins>
    </build>
  - mvn package 를 해 보면
    target 디렉토리가 생성됨
     



   . target/classes : src/main/java 디렉토리의 자바 소스가 컴파일된 class 파일과 src/main/resources 디렉토리 파일이 복사됨
   . target/test-classes : src/test/java 디렉토리의 자바 소스가 컴파일된 class 파일과 src/test/resources 디렉토리 파일이 복사됨
   . target/webzine : war로 패키징 하는데 필요한 모든 자원의 위치 target/classes 디렉토리 하위의 파일이
                      webzine/WEB-INF/classess 파일로 복사. target/test-classes 디렉토리 하위 파일은 제외
   . target/surefire-reports : 빌드하면서 생성된 리포트 문서의 위치
  - 웹 프로젝트의 뼈대를 만드는 방법은 두가지 방법이 있음
   . m2eclipse 이클립스 플러그인 기반으로 메이븐 프로젝트를 생성, 뒤에서 설명
   . 위에 방법과 같은 maven-archetype-webapp 로 만든후 자바 소스 디렉토리 수동 추가

Posted by gt1000

블로그 이미지
gt1000

태그목록

공지사항

어제
오늘

달력

 « |  » 2024.4
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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함