maven!
maven 이란
빌드/관리 도구, 일관적인 개발환경, 자동화된 빌드/배포환경을 제공해 개발자들이 전체 개발과정을 쉽게 이해할 수 있다.
Maven LifeCycle
Maven에서는 clean, default, site 세 가지 LifeCycle을 제공하고 있다.
각 LifeCycle은 순서를 갖는 단계(phase)로 구성된다.
LifeCycle을 이해하려면 Phase
와 Goal
의 개념을 이해해야 한다.
출처
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
이라 한다.
명령(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을 사용해 세부 실행 과정을 변경 가능하며 버전선택도 가능하고 명령어에 따라 컴파일, 패키징, 빌드, 배포를 도와주는 툴이라 할 수 있다.