maven!

maven 이란

빌드/관리 도구, 일관적인 개발환경, 자동화된 빌드/배포환경을 제공해 개발자들이 전체 개발과정을 쉽게 이해할 수 있다.

Maven LifeCycle

Maven에서는 clean, default, site 세 가지 LifeCycle을 제공하고 있다.

maven_LifeCycle

각 LifeCycle은 순서를 갖는 단계(phase)로 구성된다.
LifeCycle을 이해하려면 PhaseGoal의 개념을 이해해야 한다.

출처

https://sjh836.tistory.com/131
http://wiki.gurubee.net/display/SWDEV/Maven+LifeCycle
http://www.devkuma.com/books/2
https://www.youtube.com/playlist?list=PLq8wAnVUcTFWRRi_JWLArMND_PnZM6Yja

maven 명령

$ mvn archetype:generate -DgroupId=com.demo -DartifactId=javaDemo -DarchetypeArtifactId=maven-archetype-quickstart

maven으로 만들어지는 프로젝트 충돌을 피하기 위해 groupId 설정
이미 기존에 만들어진 프로젝트 구조를 사용하기 위해 archetypeArtifactId 설정
프로젝트명은 artifactId설정.

프로젝트 구조(Artifact)는 다른사람에게 공유할 수 도 있다.

명령을 실행하면 다운로드 문구가 뜨며 아래와 같은 입력 문구가 출력된다.

Define value for property 'version' 1.0-SNAPSHOT: :
[INFO] Using property: package = com.demo
Confirm properties configuration:
groupId: com.demo
artifactId: javaDemo
version: 1.0-SNAPSHOT
package: com.demo
Y: :

모두 엔터치고 진행
javaDemo 디렉토리가 생성되고 내부에 pom.xml, src폴더가 생성된다.

pom.xml 위치에서 아래 명령 수행

mvn compile

target폴더가 생겼을 것인데 내부에 java파일이 컴파일되어 만들어진 class파일들이 존재한다.
다시 pom.xml 위치에서 아래 명령 수행

mvn package

[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ javaDemo ---
Downloading from central: https://repo.maven.apache.org/maven2/commons-lang/commons-lang/2.1/commons-lang-2.1.jar
Downloaded from central: https://repo.maven.apache.org/maven2/commons-lang/commons-lang/2.1/commons-lang-2.1.jar (208 kB at 264 kB/s)
[INFO] Building jar: /Users/user/Documents/maven/javaDemo/target/javaDemo-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  10.453 s
[INFO] Finished at: 2019-09-20T11:38:45+09:00
[INFO] ------------------------------------------------------------------------

target아래에 javaDemo-1.0-SNAPSHOT.jar 파일이 생성된다.
실행하려면 아래 명령 수행

java -cp target/javaDemo-1.0-SNAPSHOT.jar com.demo.App

jar파일 안의 App.class파일을 실행시킨다.

Phase와 Plug-in:Goal

phase는 일종의 빌드 단계이다.

phase엔 연결된 plug-in이 있고
plug-in이 명령을 수행한다.
그리고 plug-in이 수행하는 명령을 goal이라 한다.

maven_phase

명령(goal)을 수행하려면 항상 plug-in과 묶음으로 실행해야한다.
mvn <plugin>:<goal> => mvn archetype:generate

그리고 이런 명령들을 묶어 놓은 phase를 다음과 같이 실행한다.

mvn <phase> => mvn install
maven을 사용해 왔다면 mvn compile, mvn tset, mvn package등의 명령을 수행해 보았을 것이다.(이클립스나 인텔리J안에서…)

Default LifeCycle안의 phase순서는 아래와 같다.
mvn help:describe -Dcmd=compile 명령을 실행해보자. compile 페이즈를 수행하려면 어떤 플러그인과 골이 필요한지 출력한다.

org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
It is a part of the lifecycle for the POM packaging 'jar'. This lifecycle includes the following phases:

플러그인:골이 출력되고 compile페이즈는 POM packaging 'jar'를 위한 lifecycle의 일부라 한다.

그리고 아래에 complie페이즈가 속한 lifecycle의 모든 페이즈를 순서대로 출력하는데 default lifecycle의 페이즈들이다.

  • validate: Not defined
  • initialize: Not defined
  • generate-sources: Not defined
  • process-sources: Not defined
  • generate-resources: Not defined
  • process-resources: org.apache.maven.plugins:maven-resources-plugin:2.6:resources
  • compile: org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
  • process-classes: Not defined
  • generate-test-sources: Not defined
  • process-test-sources: Not defined
  • generate-test-resources: Not defined
  • process-test-resources: org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
  • test-compile: org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
  • process-test-classes: Not defined
  • test: org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
  • prepare-package: Not defined
  • package: org.apache.maven.plugins:maven-jar-plugin:2.4:jar
  • pre-integration-test: Not defined
  • integration-test: Not defined
  • post-integration-test: Not defined
  • verify: Not defined
  • install: org.apache.maven.plugins:maven-install-plugin:2.4:install
  • deploy: org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy

수많은 phase들, 그리고 phase가 기본적으로 실행하는 plug-in:goal이 있다.

우리가 mvn compile 명령으로 compile페이즈를 실행하면 그 전, 상위의 페이즈들을 우선적으로 실행된다. (validate ~ process-resources)
페이즈들의 순서를 바꾸거나 없앨 순 없지만 적용된 플러그인을 변경할 수 있다. 변경은 pom.xml 의 설정을 통해 가능하다.

아파치 웹페이지에서 각종 프러그인 설명을 볼 수 있다.
http://maven.apache.org/plugins/index.html

컴파일 플러그인 변경하기

compile: org.apache.maven.plugins:maven-compiler-plugin:3.1:compile

위처럼 설정된 플러그인을 변경해보자. 기존 java 버전은 다른 버전으로 변경해보자.

http://maven.apache.org/plugins/maven-compiler-plugin/

위 링크를 보면 compiler-plugin은 2개의 골을 가지고 있다.

compiler:compile is bound to the compile phase and is used to compile the main source files. compiler:testCompile is bound to the test-compile phase and is used to compile the test source files.

다시 default lifecycle의 페이즈들을 살펴보면 2개의 페이즈가 같은 플러그인이 2개의 각기 다른 골을 사용하는 것을 볼 수 있다.

  • compile: org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
  • test-compile: org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile

우리가 처음 maven프로젝트 생성시 maven-archetype-quickstart을 사용해 만들었는데 기본 java버젼이 1.5이다.

컴파일 플러그인 설정을 통해 1.8로 변경해보자.

<project ...>
  ...
  ...
  <dependencies>
    <dependency>
      ...
    </dependency>
  </dependencies>
  <!-- 추가된 엘리먼트 플러그인 설정 -->
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

자바 버전 변경은 매우 흔히 사용하는 설정인데 추가해야할 엘리먼트가 너무 많다….
이 때문에 maven 3.6 이후부터는 더 간결하게 설정 가능하다.

<project ...>
  ...
  ...
  <dependencies>
    <dependency>
      ...
    </dependency>
  </dependencies>
  <!-- 추가된 엘리먼트 플러그인 설정 -->
  <properties>
    <maven-compiler.source>1.8</maven-compiler.source>
    <maven-compiler.target>1.8</maven-compiler.target>
  </properties>
</project>

물론 더 자세한 설정정보를 입력하려면 전자의 방법을 사용하자.

요약하면 maven은 java프로젝트건 웹 프로젝트건 spring framework, spring boot를 사용하건 필요한 library를 dependency에 등록하면 자동으로 원격저장소에서 jar파일을 다운받아주고

plugin을 사용해 세부 실행 과정을 변경 가능하며 버전선택도 가능하고 명령어에 따라 컴파일, 패키징, 빌드, 배포를 도와주는 툴이라 할 수 있다.

카테고리:

업데이트: