본문으로 건너뛰기

4.2 메이븐

메이븐 저장소

Apache Maven은 Java 애플리케이션 개발에 있어 소프트웨어 프로젝트의 생성, 관리, 빌드에 사용되는 분산 빌드 자동화 도구이다. 메이븐(maven)은 프로젝트 객체 모델(POM; Project Object Model)이라는 표준 설정 파일을 이용하여 프로젝트의 정의 및 빌드 과정을 관리할 수 있다. POM은 모듈 또는 컴포넌트 종속 관계, 빌드의 순서 및 프로젝트 패키징 결과를 XML 파일을 사용하여 정의한다. 이렇게 하여 프로젝트가 완전히 통일된 상태로 빌드되도록 한다.

메이븐은 저장소를 사용한다. 메이븐 저장소에는 Java 라이브러리, 플러그인 및 기타 아티팩트가 들어 있다. 기본 공용 저장소는 Maven 2 Central Repository 이지만, 여러 개발 팀간에 공통 아티팩트를 공유해야 한다면 회사의 내부 저장소를 구성하여 사용할 수도 있다. 또 타사 저장소도 있다. JBoss EAP 6는 Java EE 개발자가 일반적으로 JBoss EAP 6애플리케이션을 빌드할 때 사용하는 것들을 제공되어 있다. JBoss EAP 6저장소를 프로젝트를 사용할 수 있도록 설정하려면 ‘JBoss Enterprise Application Platform의 메이븐 저장소 구성’ 문서를 참조한다.

저장소는 원격으로 할 수도 있고 로컬로 할 수도 있다. 원격 저장소는 웹 서버의 저장소 설정 시에는 ‘http://’를 사용하고, 파일 서버 저장소는 ‘file://’ 라는 프로토콜을 사용하도록 설정한다. 로컬 저장소는 원격 저장소에서 아티팩트를 다운로드하여 캐시한 것이다.

메이븐에 대한 자세한 정보는 ‘http://maven.apache.org/’을 참조한다.

또 메이븐 저장소의 정보는 ‘http://maven.apache.org/repository’ 를 확인하라.

메이븐POM 파일에 대한 자세한 정보는 ‘http://maven.apache.org/pom.html’에서 확인할 수 있다.

메이븐 POM 파일

프로젝트 객체 모델(POM) 파일은 프로젝트를 빌드하기 위해 메이븐에서 사용되는 설정 파일이다. POM 파일은 XML 파일에서 프로젝트 정보와 빌드 방법을 포함하고 있다. 여기에는 소스 및 테스트 디렉터리 위치, 프로젝트 의존성 플러그인 저장소 등 수행 할 수 있는 골(goal)이 포함되어 있다. 또한 버전, 세부 사항, 개발자 메일링 리스트, 라이센스 등 프로젝트에 대한 추가 정보도 포함된다. pom.xml 파일의 스키마는 http://maven.apache.org/maven-v4_0_0.xsd에 있다.

POM 파일 구조

POM파일 최소 요구 사항

pom.xml 파일의 최소 요구 사항은 다음과 같다.

  • 프로젝트 루트
  • modelVersion
  • groupId - 프로젝트 그룹 ID
  • artifactId - 아티팩트(프로젝트)의 ID
  • version - 버전

샘플 pom.xml 파일

기본적인 pom.xml 파일의 구성은 다음과 같다.

<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Quick Start Archetype</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>
</project>

메이븐 설정 파일

메이븐의 settings.xml 파일에는 메이븐에 대한 사용자 별 설정 정보가 포함되어 있다. 개발자 ID, 프록시 정보, 로컬 저장소의 위치 등 pom.xml 파일에서 배포되는 사용자 별 설정이 포함되어 있다.

settings.xml 은 다음 위치에 설정 가능하다.

  • 메이븐 설치파일 위치
    • 설정 파일은 $M2_HOME/conf/ 디렉터리에 있다. 이러한 설정은 global 설정이라고 한다. 기본 메이븐 설정 파일을 복사하여 이를 바탕으로 사용자 설정 파일을 설정할 수 있다.
  • 사용자 설치위치
    • 설정 파일은 $USER_HOME/. m2/ 디렉터리에 있다. 메이븐 설치디렉터리와 사용자 settings.xml 파일이 둘 다 있으면 내용이 병합된다. 중복된 내용이 있는 경우에는 사용자 settings.xml 파일이 우선된다.

      다음은 JBoss EAP 6의 로컬 디렉터리로 메이븐 레파지토리를 구성한 settings.xml 파일의 예이다.

      <Settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
      <profiles>
      <!- Configure the JBoss EAP Maven repository ->
      <profile>
      <id>jboss-eap-maven-repository</id>
      <repositories>
      <repository>
      <id>jboss-eap</id>
      <url>file:///path/to/repo/jboss-eap-6.2-maven-repository</url>
      <releases>
      <enabled>true</enabled>
      </releases>
      <snapshots>
      <enabled>false</enabled>
      </snapshots>
      </repository>
      </repositories>
      <pluginRepositories>
      <pluginRepository>
      <id>jboss-eap-maven-plugin-repository</id>
      <url>file:///path/to/repo/jboss-eap-6.2-maven-repository</url>
      <releases>
      <enabled>true</enabled>
      </releases>
      <snapshots>
      <enabled>false</enabled>
      </snapshots>
      </pluginRepository>
      </pluginRepositories>
      </profile>
      </profiles>
      <activeProfiles>
      <!- Optionally, make the repository active by default ->
      <activeProfile>jboss-eap-maven-repository</activeProfile>
      </activeProfiles>
      </settings>

settings.xml 파일의 스키마는 http://maven.apache.org/xsd/settings-1.0.0.xsd 에 있다.

메이븐 실행

메이븐의 실행 명령은 다음과 같다.

**mvn [options] [<goal(s)>] [<phase(s)>]**

메이븐의 명령은 옵션, 골, 페이즈의 조합으로 실행할 수 있다. 메이븐에서 사용할 수 있는 옵션은 ‘mvn --help’ 명령을 실행하여 확인할 수 있다. 메이븐에서 가장 많이 사용하는 옵션 중의 하나는 -D 옵션일 것이다. 예를 들어 메이븐의 기본적인 라이프사이클에 있는 코드에 대한 단위 테스트 모듈을 실행하지 않도록 하려면, mvn –Dmaven.test.skip=true [<phase(s)>]와 같이 실행하면 된다.

메이븐에서 골와 페이즈를 조합하여 빌드를 실행할 수 있으며, 여러 개를 한꺼번에 실행하는 것도 가능하다.

**mvn clean package**`` : cleanpackage`라는 페이즈를 실행한다.

**mvn clean compiler:comple** : clean 페이즈를 실행한 후, compiler라는 플러그인의 compile 골을 실행한다.

메이븐 라이프사이클

메이븐에서 미리 정의하고 있는 빌드 순서를 라이프사이클이라고 하며, 라이프사이클의 각 빌드 단계를 페이즈(phase)라고 한다.

라이프사이클은 여러 페이즈로 나뉘어져 있고, 각각의 페이즈들은 서로 의존 관계를 갖는다.

메이븐의 기본적인 라이프사이클은 다음 표와 같다.

페이즈설명
compile소스를 컴파일한다.
testJUnit, TestNG와 같은 단위 테스트 프레임워크를 이용하여 단위테스트를 실행한다.
package컴파일된 클래스 파일과 리소스 파일들을 WAR나 JAR 형태로 패키징한다.
install패키징한 파일을 로컬 저장소에 배포한다. 로컬 저장소의 위치는 $USER_HOME/.m2 디렉터리다.
deploy패키징한 파일을 원격 저장소에 배포한다.
clean메이븐 빌드시 생성된 모든 산출물을 삭제한다.
site메이븐 설정 파일의 정보를 이용하여 프로젝트 문서 사이트를 생성한다.

표 2. 메이븐의 기본 라이프사이클

페이즈와 골

메이븐에서 페이즈는 실제 빌드 작업을 하지 않는다. 그럼 누가 빌드 작업을 하는 것일까? 실제로 메이븐은 플러그인 구조로 구성되어 있으며, 정해진 페이즈에 연결된 플러그인의 골에서 실제 빌드 작업이 이루어지게 된다. 예를 들어 ‘mvn compile’ 이라고 했다면, 실제적인 컴파일 작업은 compile 페이즈와 연결되어 있는 compiler 플러그인의 compile 골이 실행되는 것이다.

그림 3. 페이즈와 골과의 관계

의존성 관리

메이븐의 가장 큰 장점 중의 하나는 애플리케이션을 개발하는데 필요한 jar 라이브러리 모듈들에 대한 의존성 관리이다. 프레임워크 사용을 위해 필요한 파일을 다운로드 받아 프로젝트 내에 포함시키는 것이 아니라, POM 파일의 설정을 통해 필요한 라이브러리 파일들을 자동으로 로컬 저장소에 다운로드하고 애플리케이션에 사용할 수 있게 한다.

예를 들었던 POM 파일을 살펴보면 <dependency>에 junit 이 정의되어 있다. 여기에서는 junit 3.8.1 버전이 사용되고 있다. 메이븐 빌드를 실행하면 메이븐 중앙 저장소에서 junit 3.8.1 버전의 jar 파일을 자동으로 다운로드 받아 해당 프로젝트 컴파일에 사용한다.

<project>

… 중략 …

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>3.8.1</version>

<scope>test</scope>

</dependency>

</dependencies>

</project>

기본적으로 메이븐은 중앙 저장소는 http://repo.maven.apache.org/maven2/ 이다. 필요한 모듈이 있으면 <dependency>에 pom 정의를 추가하기만 하면 자동으로 메이븐 중앙 저장소에서 필요한 jar 파일들을 다운로드 한다.

예를 들어 스프링 프레임워크를 프로젝트에 추가하려면 pom.xml 파일에 추가할 내용을 먼저 http://mvnrepository.com/ 에서 검색한다.

그림 4. 메이븐 레파지토리 검색

최신 버전인 3.2.4 버전의 spring-core 모듈에 대한 정보를 찾을 수 있었다. spring-core 3.2.4 버전 모듈에 대한 pom의 <dependency> 정의가 표시되고 있다. 이 내용을 사용할 프로젝트의 pom.xml의 <dependencies> 부분에 추가하면 spring-core에 dependency를 갖는 commons-logging, log4j 등의 jar 파일들도 함께 프로젝트의 클래스 패스에 추가되어 컴파일 시 사용된다.

Spring Framework에 대한 dependency가 추가된 pom.xml 파일은 다음과 같다.

<project>
… 중략 …
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

플러그인

앞서 설명한 것과 같이 메이븐은 플러그인 구조로 구성되어 있다. 메이븐의 빌드 프로세스를 변경하기 위해, 추가적인 메이븐 플러그인을 사용하거나 이미 포함되어 있는 플러그인의 파라미터를 설정하기 위해서도 플러그인 설정을 한다.

추가적인 메이븐 플러그인들은 http://mojo.codehaus.org/plugins.html 에서 찾아볼 수 있다.

또, JBoss 서버를 구동하거나 빌드된 애플리케이션을 JBoss에 배포하기 위한 JBoss Deployment Plugin을 제공하고 있다. (http://docs.jboss.org/jbossas/7/plugins/maven/latest/)

JBoss Maven 플러그인을 사용하려면 pom.xml 파일의 <build> 하위에 jboss-as-maven-plugin을 아래와 같이 추가한다.

<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.jboss.as.plugins</groupId>
<artifactId>jboss-as-maven-plugin</artifactId>
<version>7.5.Final</version>
</plugin>
...
</plugins>
...
</build>
...
</project>

jboss-as-maven-plugin을 설정하면 다음과 같이 jboss-as 플러그인을 사용하여 애플리케이션을 배포할 수 있다.

$ mvn jboss-as:deploy

$ mvn jboss-as:undeploy

이 외에도 JBoss 애플리케이션 서버에 대하여 사용할 수 있는 골은 jboss-as:add-resource, jboss-as:execute-commands(CLI 명령을 실행), jboss-as:run, jboss-as:shutdown, jboss-as:start 등이 있다.

또, JBoss EAP의 도메인 모드의 서버 그룹에 애플리케이션을 배포하려면 다음과 같이 메이븐 플러그인을 설정하면 된다.

<plugin>
<groupId>org.jboss.as.plugins</groupId>
<artifactId>jboss-as-maven-plugin</artifactId>
<version>7.5.Final</version>
<configuration>
<domain>
<server-groups>
<server-group>**main-server-group**</server-group>
</server-groups>
</domain>
</configuration>
</plugin>