2012. 3. 14. 15:23 빌드/maven
Maven 10장 - 메이븐 모듈
이 내용은 박재성님이 집필하신 [자바 세상의 빌드를 이끄는 메이븐] 책을 그대로 정리한 것이다.
회사에서 스터디를 하는데 문서 보안 때문에 어쩔수 없이 블로그를 이용하게 되었고,
위 내용은 박재성님의 허락을 받았습니다.
10 메이븐 모듈
책에는 나오지 않지만 이 장을 통틀어서 가장 중요한 내용이 아닐까 해서 작성해 메모해 둠
실제 우리가 프로젝트를 하다보면 종속적인 모듈 관계보다 디렉토리는 병렬 구조에 관계만
부모 자식간의 관계를 맺고 싶을때가 있다.
즉 하나의 디렉토리에
전체 프로젝트를 관리하는 부모 역활을 하는 webzine 이 있고, 이 프로젝트의 모듈인 user, admin
그리고 user, admin의 공통 부분만을 뽑아서 core 라는 것을 만들었다고 가정하자.
1 부모에서 자식 찾기
webziine 의 pom.xml 파일에
<modules>
<module>../core</module>
<module>../admin</module>
<module>../user</module>
</modules>
추가 이런 식으로 부모 pom.xml 로 부터 ../ 현재 디렉토리 위에 있는 디렉토리를 명시
2 자식에서 부모 지정하기
예를들어 core 프로젝트에서
<parent>
<artifactId>webzine</artifactId>
<groupId>com.samsunglife</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../webzine/pom.xml</relativePath>
</parent>
와 같이 부모 pom.xml 위치를 지정해 주면된다.
- webzine 의 관리자 모듈이 필요해서 추가해야 할 경우가 발생 했다고 가정하자. 공통 부분을 core, 일반사용자용을 user, 관리자를 admin
이라 했을때 다음과 같은 의존 관계를 가짐
1) 메이븐 모듈
- 메이븐은 하나의 프로젝트에서 여러 모듈을 관리할수 있는 모듈 기능을 지원
- 한 프로젝트가 여러 모듈을 가지면서 빌드를 한번에 진행. 메이븐의 모듈 개념을 이해하려고 활용하려면
상소 Inheritance, 집합 aggregation, 의존관계 dependency 개념을 이해해야 함
가 상속
- 최상위 POM을 상속하듯, 프로젝트에서 공통으로 사용하는 설정은 공통 POM 파일을 만들어 관리하고 하위 모듈에서 이 POM 파일을 상속
- 메이븐에서 상속 기능을 사용하려면 먼저 부모 parent POM 파일을 생성한 다음 부모 POM 파일의 <packaging/> 엘리먼트 값을 pom 으로 설정
부모 parent POM 파일
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.samsunglife</groupId>
<artifactId>webzine-core</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
[...]
</project>
자식 POM 파일은 <parent/> 엘리먼트를 이용하여 부모 POM 파일을 상속
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>webzine</artifactId>
<groupId>com.samsunglife</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.samsunglife</groupId>
<artifactId>core</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>core</name>
<description>공통</description>
</project>
- <parent/> 엘리먼트를 설정하면 상위 디렉토리에 있는 pom.xml 파일을 부모 POM으로 찾음
나 집합
- 하나의 프로젝트가 여러 모듈로 분리될 경우 모듈간의 의존 관계가 발생하므로 빌드를 모듈별로 진행할 경우 빌드가 실패할 가능성이 높음
각 모듈은 하나의 프로젝트로 같이 발전하기에 한번에 빌드할 필요가 있고, 여러 모듈을 빌드할때 같은 단위로 빌드할수 있도록 지원하는 기능이 집합
- 집합 기능은 일반적으로 프로젝트의 최상위 POM 설정 파일에서 <modules/> 엘리먼트로 설정
공통 설정을 관리하는 부모 pom.xml에서 아래와 같이 설정
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.samsunglife</groupId>
<artifactId>webzine</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>webzine</name>
<modules>
<module>core</module>
<module>user</module>
<module>admin</module>
</modules>
</project>
위와 같이 설정한후 부모 POM 파일이 있는 디렉토리에서 빌드를 하면 최상위 프로젝트(webzine), core, user, admin 모듈이 한번에 빌드를 실행
다 의존 관계
- 하나의 프로젝트를 여러 모듈로 분리할 경우 각 모듈 사이에 의존 관계가 발생. core 모듈을 user, admin 모듈이 의존 관계를 가짐
user 모듈의 pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>webzine</artifactId>
<groupId>com.samsunglife</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.samsunglife</groupId>
<artifactId>user</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user</name>
<dependencies>
<dependency>
<groupId>com.samsunglife</groupId>
<artifactId>core</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
2) 웹진 프로젝트에 모듈 기능 적용
- 하나의 프로젝트를 여러 프로젝트로 분리할 경우 가장 큰 이슈는 각 모듈에서 발생하는 중복 코드. 소스 외에도 설정파일, POM 파일에서
중복 코드를 제거하기 위해 지속적인 리팩토링과 개선 작업이 필요
가 모듈 생성
- 부모 프로젝트의 <packaging/> 값을 war 에서 pom 으로 수정
-> 부모 프로젝트로 이동한 후 mvn archetype:generate 를 실행하여 maven-archetype-quickstart 아키타입 기반으로 core 모듈을 생성
(m2eclipse 의 maven 프로젝트 모듈 기능으로 생성해도 됨)
-> 부모 pom.xml에서
<modules>
<module>core</module>
</modules>
추가
-> core 프로젝트 pom.xml 에서
<parent>
<artifactId>webzine</artifactId>
<groupId>com.samsunglife</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
추가
-> 부모 프로젝트에서 mvn test 실행
-> 같은 과정으로 user,admin 모듈 생성
-> user, admin pom.xml에 의존 관계
<dependencies>
<dependency>
<groupId>com.samsunglife</groupId>
<artifactId>core</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
추가
나 소스 코드 이동
- 소스를 자식 모듈로 이동. core, user, admin 분리
다 리소스 파일 분리
- 같이 사용하는 파일은 복사해서 붙여넣기
라 POM 설정 이동 및 변경
- 생략
마 이클립스로 모듈 가져오기
- 부모 프로젝트에서 mvn eclipse:clean eclipse:eclipse 를 실행하면 세개의 모듈이 동시에 빌드됨
- 만약 m2eclipse 플러그인으로 만들지 않았다면 이클립스로 가져오는 작업을 해야함
일반적으로 General -> Existing Project into Workspace 기능을 사용하지만 이 기능을 사용할 경우
각 모듈을 하나씩 가져오므로 한번에 가져오는
File -> import -> Maven -> Existing Maven Projects 를 선택, 이 기능은 반드시 m2eclipse 플러그인이 설치 되어 있어야 함
Next 를 클릭후 최상위 부모 프로젝트를 선택함
- jetty 설정은 생략
3) 웹진 프로젝트에 배치 모듈 추가
가 웹진 프로젝트에 배치 모듈 추가
- batch 모듈을 추가함, 부모를 상속하고 core 와 의존관계를 가짐
- 설정 생략
나 웹진 배치 모듈 배포 및 실행
- 의존 관계에 있는 라이브러리를 특정 디렉토리로 복사하는 dependency 플러그인의 copy-dependencies 골 사용
- 생략
회사에서 스터디를 하는데 문서 보안 때문에 어쩔수 없이 블로그를 이용하게 되었고,
위 내용은 박재성님의 허락을 받았습니다.
10 메이븐 모듈
책에는 나오지 않지만 이 장을 통틀어서 가장 중요한 내용이 아닐까 해서 작성해 메모해 둠
실제 우리가 프로젝트를 하다보면 종속적인 모듈 관계보다 디렉토리는 병렬 구조에 관계만
부모 자식간의 관계를 맺고 싶을때가 있다.
즉 하나의 디렉토리에
전체 프로젝트를 관리하는 부모 역활을 하는 webzine 이 있고, 이 프로젝트의 모듈인 user, admin
그리고 user, admin의 공통 부분만을 뽑아서 core 라는 것을 만들었다고 가정하자.
1 부모에서 자식 찾기
webziine 의 pom.xml 파일에
<modules>
<module>../core</module>
<module>../admin</module>
<module>../user</module>
</modules>
추가 이런 식으로 부모 pom.xml 로 부터 ../ 현재 디렉토리 위에 있는 디렉토리를 명시
2 자식에서 부모 지정하기
예를들어 core 프로젝트에서
<parent>
<artifactId>webzine</artifactId>
<groupId>com.samsunglife</groupId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../webzine/pom.xml</relativePath>
</parent>
와 같이 부모 pom.xml 위치를 지정해 주면된다.
- webzine 의 관리자 모듈이 필요해서 추가해야 할 경우가 발생 했다고 가정하자. 공통 부분을 core, 일반사용자용을 user, 관리자를 admin
이라 했을때 다음과 같은 의존 관계를 가짐
1) 메이븐 모듈
- 메이븐은 하나의 프로젝트에서 여러 모듈을 관리할수 있는 모듈 기능을 지원
- 한 프로젝트가 여러 모듈을 가지면서 빌드를 한번에 진행. 메이븐의 모듈 개념을 이해하려고 활용하려면
상소 Inheritance, 집합 aggregation, 의존관계 dependency 개념을 이해해야 함
가 상속
- 최상위 POM을 상속하듯, 프로젝트에서 공통으로 사용하는 설정은 공통 POM 파일을 만들어 관리하고 하위 모듈에서 이 POM 파일을 상속
- 메이븐에서 상속 기능을 사용하려면 먼저 부모 parent POM 파일을 생성한 다음 부모 POM 파일의 <packaging/> 엘리먼트 값을 pom 으로 설정
부모 parent POM 파일
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.samsunglife</groupId>
<artifactId>webzine-core</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
[...]
</project>
자식 POM 파일은 <parent/> 엘리먼트를 이용하여 부모 POM 파일을 상속
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>webzine</artifactId>
<groupId>com.samsunglife</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.samsunglife</groupId>
<artifactId>core</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>core</name>
<description>공통</description>
</project>
- <parent/> 엘리먼트를 설정하면 상위 디렉토리에 있는 pom.xml 파일을 부모 POM으로 찾음
나 집합
- 하나의 프로젝트가 여러 모듈로 분리될 경우 모듈간의 의존 관계가 발생하므로 빌드를 모듈별로 진행할 경우 빌드가 실패할 가능성이 높음
각 모듈은 하나의 프로젝트로 같이 발전하기에 한번에 빌드할 필요가 있고, 여러 모듈을 빌드할때 같은 단위로 빌드할수 있도록 지원하는 기능이 집합
- 집합 기능은 일반적으로 프로젝트의 최상위 POM 설정 파일에서 <modules/> 엘리먼트로 설정
공통 설정을 관리하는 부모 pom.xml에서 아래와 같이 설정
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.samsunglife</groupId>
<artifactId>webzine</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>webzine</name>
<modules>
<module>core</module>
<module>user</module>
<module>admin</module>
</modules>
</project>
위와 같이 설정한후 부모 POM 파일이 있는 디렉토리에서 빌드를 하면 최상위 프로젝트(webzine), core, user, admin 모듈이 한번에 빌드를 실행
다 의존 관계
- 하나의 프로젝트를 여러 모듈로 분리할 경우 각 모듈 사이에 의존 관계가 발생. core 모듈을 user, admin 모듈이 의존 관계를 가짐
user 모듈의 pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>webzine</artifactId>
<groupId>com.samsunglife</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.samsunglife</groupId>
<artifactId>user</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user</name>
<dependencies>
<dependency>
<groupId>com.samsunglife</groupId>
<artifactId>core</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
2) 웹진 프로젝트에 모듈 기능 적용
- 하나의 프로젝트를 여러 프로젝트로 분리할 경우 가장 큰 이슈는 각 모듈에서 발생하는 중복 코드. 소스 외에도 설정파일, POM 파일에서
중복 코드를 제거하기 위해 지속적인 리팩토링과 개선 작업이 필요
가 모듈 생성
- 부모 프로젝트의 <packaging/> 값을 war 에서 pom 으로 수정
-> 부모 프로젝트로 이동한 후 mvn archetype:generate 를 실행하여 maven-archetype-quickstart 아키타입 기반으로 core 모듈을 생성
(m2eclipse 의 maven 프로젝트 모듈 기능으로 생성해도 됨)
-> 부모 pom.xml에서
<modules>
<module>core</module>
</modules>
추가
-> core 프로젝트 pom.xml 에서
<parent>
<artifactId>webzine</artifactId>
<groupId>com.samsunglife</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
추가
-> 부모 프로젝트에서 mvn test 실행
-> 같은 과정으로 user,admin 모듈 생성
-> user, admin pom.xml에 의존 관계
<dependencies>
<dependency>
<groupId>com.samsunglife</groupId>
<artifactId>core</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
추가
나 소스 코드 이동
- 소스를 자식 모듈로 이동. core, user, admin 분리
다 리소스 파일 분리
- 같이 사용하는 파일은 복사해서 붙여넣기
라 POM 설정 이동 및 변경
- 생략
마 이클립스로 모듈 가져오기
- 부모 프로젝트에서 mvn eclipse:clean eclipse:eclipse 를 실행하면 세개의 모듈이 동시에 빌드됨
- 만약 m2eclipse 플러그인으로 만들지 않았다면 이클립스로 가져오는 작업을 해야함
일반적으로 General -> Existing Project into Workspace 기능을 사용하지만 이 기능을 사용할 경우
각 모듈을 하나씩 가져오므로 한번에 가져오는
File -> import -> Maven -> Existing Maven Projects 를 선택, 이 기능은 반드시 m2eclipse 플러그인이 설치 되어 있어야 함
Next 를 클릭후 최상위 부모 프로젝트를 선택함
- jetty 설정은 생략
3) 웹진 프로젝트에 배치 모듈 추가
가 웹진 프로젝트에 배치 모듈 추가
- batch 모듈을 추가함, 부모를 상속하고 core 와 의존관계를 가짐
- 설정 생략
나 웹진 배치 모듈 배포 및 실행
- 의존 관계에 있는 라이브러리를 특정 디렉토리로 복사하는 dependency 플러그인의 copy-dependencies 골 사용
- 생략
'빌드 > maven' 카테고리의 다른 글
Maven 12장 - 표준 POM 파일 생성 및 리팩토링 (0) | 2012.03.15 |
---|---|
Maven 11장 - 메이븐 사내 저장소 설치 및 활용 (0) | 2012.03.14 |
Maven 9장 - 리포팅 기능을 활용한 문서 관리 (0) | 2012.03.05 |
Maven 8장 - 메이븐 프로파일, 배포 (0) | 2012.03.05 |
Maven 7장 - 메이븐과 데이터베이스 통합 (0) | 2012.03.04 |