본문 바로가기

소프트웨어/Maven

[Build/Maven] Plugin Phase

Phase, Plugin

메이븐의 페이즈는 여러 플러그인이 동작할 수 있으며. 플러그인을 사용하고자 한다면 아래와 같이 설정한다.

  <build>
    <finalName>moment</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maaven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
          <warSourceDirectory>webapp</warSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>

해당 플러그인만 사용하고자 한다면 아래와 같다.

mvn groupId:artifactId:version:goal


위와 같은 maven-war-plugin을 사용하고자 한다면

mvn org.apache.maven.plugins:maven-war-plugin:3.0.0:war


하지만 이와같은 방법은 너무 번거롭다 따라서 다음과 같은 방식을 따른다면 아래와 같이 쉽게 사용 가능하다.


규칙

  1. 가장 최신 버전의 플러그인 실행을 원한다면 version 정보를 제거
  2. artifactId가 maven-name-plugin이나 name-maven-plugin이라면 groupId:name:goal형식으로 사용 가능
  3. settings.xml에 아래와 같이 정의되어 있다면 name:goal형식으로 사용 가능하며, 기본적으로 org.apache.maven.plugins, org.codehaus.mojo를 가지고있다.
     <pluginGroups>
         <pluginGroup>groupId</pluginGroup>
     </pluginGroups>
    
  4. 최종적으로 name:goal형식으로 사용이 가능하다.


로그를 통해 확인해보자

> mvn test
[WARNING]
[WARNING] Some problems were encountered while building the effective settings
[WARNING] Unrecognised tag: 'activeProfiles' (position: START_TAG seen ...</pluginRepositories>\n
   <activeProfiles>... @70:23)  @ C:\Users\SDS\.m2\settings.xml, line 70, column 23
[WARNING]
[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for org.prudy:moment:war:1.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-war-plugin is missing. @ line 21, column 15
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building moment Maven Webapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ moment --- // PROCESS-RESOUCE PHASE
[WARNING] Using platform encoding (MS949 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ moment ---  // COMPILE PHASE
[INFO] No sources to compile
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ moment --- // PROCESS-TEST-RESOURCE PHASE
[WARNING] Using platform encoding (MS949 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory d:\study\maven\moment\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ moment --- // TEST-COMPILE PHASE
[INFO] No sources to compile
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ moment --- // TEST PHASE
[INFO] No tests to run.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.490 s
[INFO] Finished at: 2016-09-19T19:11:15+09:00
[INFO] Final Memory: 11M/247M
[INFO] ------------------------------------------------------------------------

메이븐의 기본 페이즈와 플러그인

process-resourse

process-resource 페이즈에서는 resource:resources를 실행시킨다, 프로젝트에 설정된 리소스(project.build.resources.*) 하위 모든 파일들을 target/classes에 옮겨준다.

만약 별도 추가적인 resource 디렉토리나, 자바 소스와 함께 특정할 리소스가 같이 있다면 아래와 같이 설정해주면 된다.

<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>
위 설정은 src/main/resources 디렉토리를 설정하고(resouces 수정시 기본 resouce 디렉토리도 추가해주지 않으면 포함되지 않는다)
src/main/java에서 java확장자파일을 제외한 리소스만 포함한다는 뜻이다.

로그중에서는 아래와 같이 확인할 수 있다.

[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ moment ---


compile

compile 페이즈에서는 compiler:compile을 실행시킨다, 프로젝트에 설정된 위치(project.build.sourceDirectory) 디렉토리를 하위에 모든 java파일을 target/classes로 컴파일한다. 소스 위치를 변경하고 싶다면 아래와 같이 하면된다.

<project>
  <build>
    ...
    <sourceDirectory>src/java/somthing</sourceDirectory>
    ...
  </build>
</project>

플러그인에 대한 설정변경은 아래와 같이 할 수 있다.

<project>
  <build>
    ...
    <plugins>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
          <encodeing>utf-8</encodeing>>
        </configuration>
      </plugin>
    </plugins>
    ...
  </build>
</project>
컴파일할 대상 소스의 버전과 컴파일된 소스 파일의 버전, 컴파일 인코딩 방식을 정의한 예제이다.


process-test-resource, test-compile

test관련 페이즈로는 process-test-resouce와 test-compile이 있다.

각각의 플러그인:골으로는 아래와 같다.

리소스

resouces:testResources

컴파일

compile:testCompile


test

target/test-classes에 컴파일된 단위테스트 클래스를 실행하고 target/surfire에 결과물을 생성한다.

테스트 케이스별로 나누어서 실행하고 싶을땐 아래와 같이 한다.

단건

mvn -Dtest=AllUnitTests test

다건

mvn -Dtest=AllUnitTests,AllIntegrationTest test

빌드시에는 모든 유닛테스트가 정상이 아니거나, 결과가 정상이 아니어도 배포가 필요할때가 있을 수 있다면 아래와 같이 skip하면 된다.

mvn -Dmaven.test.skip=true test

또는 pom.xml에 project.properties.maven.test.skip 프로퍼티를 true로 설정해주면 된다.

테스트가 실패하더 빌드가 되길 원한다면 surfire 플러그인 설정은 변경해야한다.

...
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surfire-plugin</artifactId>
    <configuration>
        <testFailureIgnore>true</testFailureIgnore>
    </configuration>
  </plugin>
...

package

컴파일된 바이너리 파일과 리소스를 형식에 맞춰 압축한다.

mvn package

패키지 네이밍은 아래와 같은 규칙으로 생성된다.

  • build.finalName 이 있을 경우
    • ${finalName}.${packaging}
  • build.finalName이 없는 경우
    • ${artifactId}-${version}.${packaging}

install/deploy

여기서 배포는 실 서버의 배포를 뜻하진 않는다.

mvn install

mvn deploy

  • install : 로컬저장소에 배포한다.
  • deploy : 외부저장소에 배포한다, 다른 배포된 디펜던시를 받아 쓸 수 있다.

상세 설정 방법은 구글에서 찾아볼 것!


clean

보통은 IDE에서 auto building 기능을 통해 자동적으로 수정된 파일을 교체해주지만 잘 안되는 경우 clean페이즈를 통해서 빌드 결과물을 제거할 수 있다.

mvn clean

'소프트웨어 > Maven' 카테고리의 다른 글

[Build/Maven] 소개  (0) 2016.12.02