자바 프로젝트 관리를 위한 Maven
Maven?
Maven은 자바 프로젝트의 빌드를 자동화 해주는 빌드 프레임워크이다.
아파치 메이븐(Apache Maven)은 자바용 프로젝트 관리 프레임워크의 하나이고, 아파치 앤트(Apache Ant) 대용으로 만들어졌습니다. 메이븐은 자바 소스를 Compile하고 Package해서 Deploy하는 일련의 일을 자동화 해줍니다.
POM.xml을 이용하여 이런 Dependency들을 관리하게 됩니다. POM이란 Project Object Model의 약자입니다. POM은 Maven의 기본 수행 단위며 xml 파일이고, Maven build를 위해 필요한 Project 및 Configuration detatil 정보를 담고 있습니다. Maven은 Central repository라는 라이브러리 저장소로부터 Dependency가 있는 것을 자동으로 다운로드 하고 빌드를 수행합니다.
Maven의 주요 기능 및 장점
1. 의존성 관리 (Dependency Management) : 오픈소스 라이브러리 혹은 프로젝트, 모듈간 의존성 관리를 아주 쉽게 할 수 있다. 2. IDE로 부터 독립적 : 이크립스, IntelliJ 등의 IDE로 부터 종속적인 부분을 제거할 수 있다. 3. Maven Profile : Maven profile 기능을 활용해 배포 환경에 따른 설정 파일을 관리하고 배포 파일을 생성할 수 있다.
- 프로젝트 작성, 컴파일, 테스트 등 프로젝트 라이프사이클에 포함되는 각 테스트를 지원해준다.
- 의존 라이브러리들을 pom.xml로 관리하므로 버전 관리 시스템에 공유할 파일 크기가 줄어든다.
Maven 설치
자바 환경과 이클립스가 모두 갖추어졌다는 가정 하에 진행되는 설치 방법입니다. 자바를 설치 후 환경 변수에 JAVA_HOME
이 있어야 합니다. JAVA_HOME
은 jdk파일의 위치를 가리킵니다.
먼저 Maven 페이지에 접속하여 Binary zip archive를 다운받고, 원하는 위치에 압축을 해제해줍니다.
그 후 환경 변수를 설정해줍니다. 내 PC - 속성 - 고급 시스템 설정 - 환경 변수
로 설정하셔도 되고, 윈도우10의 경우 검색에서 환경 변수
를 검색한 다음 시스템 환경 변수 편집
을 누른 후 환경 변수
버튼을 클릭하여 수정 가능합니다.
먼저 MAVEN_HOME
환경 변수를 설정해 줍니다. 아래와 같이 설정을 하고, 변수 값은 Maven을 압축 해제한 곳의 경로를 입력해주면 됩니다. 그 후 기존의 Path
환경 변수에 %MAVEN_HOME%\bin
을 추가해줍니다.
위와 같이 설치와 설정을 진행하신 후 CMD에서 mvn --version
을 입력하시면 아래와 같이 Maven이 작동하는 것을 확인할 수 있습니다.
그 후 이클립스에서 Maven 플러그인을 설치해줍니다. M2Eclipse에 접속하여 아래와 같이 Installation의 플러그인 다운로드 링크 주소를 복사합니다. http://download.eclipse.org/technology/m2e/releases
그 후 이클립스의 Help
에 Install New Software
를 통해 다운로드 및 설치를 할 수 있습니다.
POM.xml
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>DetectSpringServer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>DetectSpringServer</name>
<description>Spring server to provide object detection by Restful API</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- For Tensorflow -->
<dependency>
<groupId>org.tensorflow</groupId>
<artifactId>tensorflow</artifactId>
<version>1.12.0</version>
</dependency>
<!-- For Tensorflow GPU acceleration -->
<dependency>
<groupId>org.tensorflow</groupId>
<artifactId>libtensorflow</artifactId>
<version>1.12.0</version>
</dependency>
<!-- For Tensorflow GPU acceleration -->
<dependency>
<groupId>org.tensorflow</groupId>
<artifactId>libtensorflow_jni_gpu</artifactId>
<version>1.12.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
위는 제가 Google의 Tensorflow와 Spring framework를 사용한 pom.xml
파일의 예제입니다. xml의 태그를 사용해 다양한 정보를 설정 가능합니다.
1. 프로젝트 정보
프로젝트 정보에는 최소한 <project> root
, modelVersion
, groupId
, artifactId
, Version
이 들어가야 합니다.
<modelVersion>
: 4.0.0이 기본이고, Maven의 pom.xml의 모델 버전이다.<groupId>
: 프로젝트를 생성한 조직 또는 그룹명으로 보통 URL의 역순으로 지정한다.<artifactId>
: 프로젝트에서 생성되는 기본 아티펙트(프로젝트)의 고유 이름이다.<version>
: 현재 애플리케이션의 버전이다.SNAPSHOT
이라는 접미사가 붙으면 아직 개발 단계라는걸 의미하며, Maven에서 라이브러리를 관리하는 방식도 달라진다.<packaging>
: jar, war, ear, pom 등 패키지 유형을 나타낸다.<name>
: 프로젝트의 이름이다.<description>
: 프로젝트의 간단한 설명이다.<url>
: 프로젝트를 찾을 수 있는 URL 이다.<properties>
: pom.xml에서 중복되어 사용되는 설정 값들을 지정할 수 있다. pom.xml파일 내에서${property_name}
으로 접근할 수 있다.<profiles>
: 개발할 때, 릴리즈 할 때 등 개발 단계에 따로 달라질 수 있는 설정 값들을 지정해줄 수 있다. Maven goal 부분의-P
옵션으로 프로파일 선택이 가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<profiles>
<profile>
<id>dev</id>
<properties>
<java.version>1.8</java.version>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<java.version>1.9</java.version>
</properties>
</profile>
</profiles>
mvn compile -P prod
2. 의존성 라이브러리 정보
의존성 라이브러리 (Dependecy Libraries) 정보에는 최소한 groupId
, artifactId
, version
정보가 들어가야 합니다. 만약, 특정 라이브러리를 사용하는데 다른 라이브러리가 필요하다면 자동으로 필요한 다른 라이브러리를 가져오기도 합니다.
<scope>
: compile, runtine, provided, test 등이 올 수 있는데 해당 라이브러리가 언제 필요한거나 필요없는지 명시할 수 있다.
3. 빌드 정보 Maven에서 핵심이라 할 수 있는 프로젝트 빌드에 관한 정보를 설정할 수 있는 곳입니다. Maven도 프로그램의 객체와 같이 Life cycle이 있는데 이를 먼저 이해하셔야 작성하시기 편합니다. Lifecycle은 아래와 같이 크게 default, clean, cite lifecycle들이 있고, 각각의 사이클 안에 페이즈(Phase) 가 있습니다. Lifecycle은 예약어로서 사용자가 임의로 변경이 불가능하고, 순서대로 실행됩니다.
default를 예로 들자면 validate가 하나의 Phase라 할 수 있고, Phase는 순서대로 수행됩니다. default의 경우 validate > initialize > … > install > deploy 순으로 진행됩니다.
process-resources
:resources:resources
를 실행해resource
디렉토리의 내용을target/classes
로 복사한다.compile
:compiler:compiler
를 실행해src/java
밑의 모든 자바 소스를 컴파일하여target/classes
로 복사한다.process-test-resources
,test-compile
:test/java
의 내용을target/test-classes
로 복사한다.test
:surefire:test
를 실행하여target/test-classes
의 테스트케이스의 유닛테스트를 수행한 후 결과를target/surefire-reports
에 생성한다.package
:<bulid>
의<finalName>
의 값을 사용하여target
디렉토리 하위의 jar, war, ear 등의 패키지 파일을 생성한다. 이름이 지정되지 않았다면artifactId-version.extension
이름으로 생성한다.install
: 로컬 저장소에 배포한다.deploy
: 원격 저장소에 배포한다.clean
: 빌드 과정 중에 생긴target
디렉토리의 내용을 삭제한다.site
:target/site
에 문서 사이트를 생성한다.site-deploy
: 문서 사이트를 서버로 배포한다.
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
32
33
34
35
36
37
<?xml version="1.0" encoding="UTF-8"?>
<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> <!-- pom model version(always 4.0.0) -->
<groupId>org.springframework</groupId> <!-- group or organization. often domain name -->
<artifactId>gs-maven</artifactId> <!-- name to be given to the project's library artifact. -->
<packaging>jar</packaging> <!-- how to be packaged. jar, war ... -->
<version>0.1.0</version> <!-- http://semver.org/lang/ko/ -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>hello.HelloWorld</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Maven의 모든 기능은 위의 소스에서 확인 가능하듯이 플러그인(Plugin) 기반으로 동작합니다. 플러그인에서 실행 가능한 작업들을 골(Goal) 이라하며 페이즈와 골은 1:1 대응이고 하나의 플러그인에는 여러 개의 골이 있을 수 있습니다.
<finalName>
: 빌드 결과물의 이름을 설정한다.<resources>
: 리소스의 파일 위치를 지정한다. 지정하지 않으면src/main/resources
로 지정된다.<testResources>
: 테스트 리소스의 파일 위치를 지정한다. 지정하지 않으면src/test/resources
로 지정된다.<Repositories>
: 빌드 시 접근할 저장소 위치를 지정할 수 있다. 기본은 Maven 기본 저장소인 Central repositoryhttp://repo1.maven.org/maven2
로 지정된다.<outputDirectory>
: 컴파일된 결과물의 위치를 지정한다. 지정하지 않으면target/classes
로 지정된다.<testOutputDirectory>
: 테스트 소스를 컴파일한 결과물의 위치를 지정한다. 지정하지 않으면target/test-classes
로 지정된다.<plugin>
: 페이즈와 골을 담당하는 Build의 메인이라 할 수 있다.<executions>
는 플러그인의 Goal과 관련된 실행에 대해 설정하고,<configuration>
에는 플러그인에 필요한 값들을 지정한다.
4. 배포 사이트 배포 시 아래와 같이 설정 가능하다.
1
2
3
4
5
6
7
8
9
10
<project>
...
<distributionManagement>
<site>
<id>website</id>
<url>scp://www.mycompany.com/www/docs/project/</url>
</site>
</distributionManagement>
...
</project>
페이즈와 골에 대한 이미지