 |
|
간단한 메이븐 2: 다수의 프로젝트 빌드 작업하기
메이븐 2를 사용하여 단순한 프로젝트를 빌드하고 테스트하는 것은 간단하다. 이번 절에서는 좀 더 현실적이고 흔한 경우로 다수의 모듈 프로젝트에 관한 예제를 보겠다.
NumOps 예제 확장하기
NumOps 예제를 이 두 번째 예제에서 확장한다. 새로운 SubOps 클래스가 빼기를 지원하기 위해 추가되었고 새 MulOps 클래스가 곱셈을 위해 추가됐다.
하지만 Operation 인터페이스와 AddOps 클래스는 NumOps 프로젝트에서 제외됐다. 그 대신 OpsImp라는 새로운 프로젝트에서 새 SubOps와 MulOps 클래스로 대체됐다. 그림 7은 NumOps와 OpsImp 프로젝트의 관계를 보여준다.
그림 7. NumOps와 OpsImp의 관계
대규모 프로젝트에서 하위 프로젝트와 하위 모듈간의 종속성은 소프트웨어 개발에 있어서 자주 발생하는 현상이다. 지금 살펴볼 기술을 사용하여 여러 모듈로 구성된 메이븐 프로젝트에 적용할 수 있다.
Listing 13에 보이는 SubOps와 비슷하게 AddOps와 비슷하게 코드를 짰다. MulOps는 여기에서 살펴보지는 않지만 비슷하다. 자세히 보고 싶은 독자들은 소스 코드를 다운로드할 수 있다.
Listing 13. Operation 인터페이스를 구현한 새 SubOps 클래스
package com.ibm.devworks;
public class SubOps implements Operation {
public int op(int a, int b) {
return a-b;
}
public String getDesc() {
return "minus";
}
} |
NumOps의 생성자는 SubOps와 MulOps 인스턴스를 각각 하나씩 생성하도록 수정했다. 소스 코드에서 자세히 살펴보기 바란다.
마스터 프로젝트 생성하기
위의 두 프로젝트로 작업할 수 있도록 마스터 프로젝트가 NumOps와 OpsImp 프로젝트 디렉터리의 한 단계 상위 디렉터리에 만들어졌다. NumOps와 OpsImp 프로젝트 둘 다 표준 메이븐 프로젝트 디렉터리 레이아웃을 사용한다. 최상위 레벨에서 프로젝트 디렉터리는 pom.xml 파일만 포함하고 있다. 그림 8은 마스터 디렉터리 바로 아래에 새로운 하위 디렉터리 구조를 보여준다.
그림 8. 복수 모듈로 구성된 프로젝트의 디렉터리 구조
제공되는 소스 코드(다운로드를 참조하기 바란다)의 example 2 디렉터리 안에서 여기 있는 여러 모듈로 구성된 프로젝트의 예제 코드를 확인할 수 있다. 최상위 레벨에 있는 pom.xml 파일은 Listing 14에 나와있다.
Listing 14. 다수 모듈로 구성된 프로젝트의 최상위 pom.xml
<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>
<groupId>com.ibm.devworks</groupId>
<artifactId>mavenex2</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Example 2</name>
<url>http://maven.apache.org</url>
<modules>
<module>NumOps</module>
<module>OpsImp</module>
</modules>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.ibm.devworks</groupId>
<artifactId>OpsImp</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
|
새로운 코드는 진하게 표시했다. 먼저 위 마스터 프로젝트의 artifact ID는 mavenex2 이고 이것의 패키지 타입은 pom이다. 이 표시로 메이븐 2에 이 프로젝트가 여러 모듈로 구성되어 있다는 것을 알려 준다.
<modules> 태그는 이 프로젝트를 구성하는 두 개의 모듈 NumOps와 OpsImp를 기술한다.
이 마스터 프로젝트의 하위 모듈들은 위에 있는 pom.xml 파일의 속성을 상속받을 수 있다. 좀 더 구체적으로 살펴보자면 하위 모듈들이 단위 테스트를 포함하더라도 JUnit에 종속성을 가질 필요가 없다. JUint 종속성은 상위 레벨로부터 상속받기 때문이다.
<dependencyManagement> 태그는 해당 모듈의 종속성을 기술하는 것이 아니라 하위 모듈에 의해 사용된다. 하위 모듈은 구체적은 버전 번호가 아니라 <dependencyManagement> 태그를 사용하여 종속성을 기술할 수 있다. 이 방법을 사용하면 프로젝트의 종속성 버전 번호가 바뀔 때 수정할 부분을 최소화할 수 있다.
마스터 POM 상속받기
한 단계 내려가서 Opslmp 디렉터리에서 이 모듈의 pom.xml 파일을 Listing 15에서 살펴보겠다.
Listing 15. 새 Opslmp 프로젝트의 pom.xml 파일
<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">
<parent>
<groupId>com.ibm.devworks</groupId>
<artifactId>mavenex2</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>OpsImp</artifactId>
<packaging>jar</packaging>
</project>
|
<parent> 요소는 이 모듈이 상속받을 마스터 POM을 나타낸다. 부모 모듈로부터 상속 받음으로써 해당 pom.xml은 엄청나게 간단해진다. 상속할 때 필요한 것은 artifact ID를 재정의하고 패키징하는 것이다. 이 모듈은 부모의 종속성(JUnit 모듈)을 상속 받는다.
NumOps의 pom.xml 또한 부모로부터 상속 받았고 매우 간단하다. Listring 16에서 pom.xml을 볼 수 있다.
Listing 16. POM 상속을 보여주는 NumOps 프로젝트의 pom.xml
<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">
<parent>
<groupId>com.ibm.devworks</groupId>
<artifactId>mavenex2</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>NumOps</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.ibm.devworks</groupId>
<artifactId>OpsImp</artifactId>
</dependency>
</dependencies>
</project>
|
 |
효율적인 POM 알아보기 상위 레벨의 POM으로부터 상속을 받을 때 모든 요소들이 적용된 pom.xml 파일을 확인할 수 있다. "효율적인 POM"을 보는 명령어는 mvn help:effective-pom이다. 이 명령어를 통해 사용자가 직접 기술하지 않은 요소들을 확인할 수 있다. 이런 것들은 Super POM으로부터 상속 받은 것이다. 모든 프로젝트의 pom.xml은 메이븐에 내장된 Super POM으로부터 암묵적으로 상속 받은 것이다. |
|
NumOps의 POM에서 흥미로운 부분은 OpsImp 프로젝트에 종속성을 기술한 것이다. 이 종속성에는 버전 번호가 기술되어 있지 않음을 주목하라. 버전 번호는 상위 모듈의 <dependencyManagement> 요소에서 이미 기술했다.
이제 상위 레벨 프로젝트에서 mvn compile 명령어를 사용하여 두 모듈을 모두 컴파일할 수 있다 또는 mvn test를 사용하여 두 모듈의 단위 테스트를 실행할 수 있다. 또 mvn install을 사용하여 패키징된 모듈을 로컬 디렉터리에 설치할 수 있다. 이렇게 함으로써 모듈들이 소스 코드에 접근할 필요 없이 종속성을 해결할 수 있다.
|