2012. 3. 15. 15:22 빌드/maven
Maven 12장 - 표준 POM 파일 생성 및 리팩토링
이 내용은 박재성님이 집필하신 [자바 세상의 빌드를 이끄는 메이븐] 책을 그대로 정리한 것이다.
회사에서 스터디를 하는데 문서 보안 때문에 어쩔수 없이 블로그를 이용하게 되었고,
위 내용은 박재성님의 허락을 받았습니다.
12 표준 POM 파일 생성 및 리팩토링
1) 요구사항 분석
- jdk 6.0
- 기반 프레임워크는 스프링
- 퍼시스턴스 계층은 mybatis 또는 hibernaate
- 프리젠테이션 계층은 struts2 또는 스프링 MVC
- 배치는 스프링 배치, 스케줄은 Quartz
- UI는 프리마커 또는 jsp 기반
- 이클립스 환경
- 책의 경우 2중 parent 구조를 가지고 있지만 나는 svn 저장 구조 및 계층 구조가 싫어서 그냥 단순히 만들어 보련다.
. samsung : 전사 공통 설정을 관리 예: 컴파일 옵션
. core : 삼성생명과 관련된 공통 설정을 관리함 예 : 암호화, 보안, 바이러스 등
. user : 일반 사용자 프로젝트
. admin : 관리자 프로젝트
프로젝트 이름을 바꿨음 samsung 빼고 이름을 지음
2) POM 설정 파일 개발
- 디렉토리 구조는
가 각 모듈의 상속, 집합 관계 개발
- 그림1의 상속 구졸르 바탕으로 설정 파일을 개발, samsung 프로젝트는 <packaging/>을 pom 으로 하고
<build>
<finalName>${project.artifactId}</finalName>
</build>
로 함. 이와 같이 하면 이 설정 파일을 상속하는 모든 모듈은 자신의 artifactId를 기준으로 빌드
- core 의 경우 부모 POM 파일을 상속 하므로 groupId, version, packaging 을 따로 설정하지 않으면 부모를 상속
버젼의 경우 특히 한곳에서 관리하는것이 좋음
그치만 여러개의 모듈을 관리할때는 부모 POM 설정의 버젼이 변경될때 자동으로 변경되는 것은 프로젝트의 위험요소 증가 가능성이 큼
따라서 표준 POM 설정을 관리하고 배포할때 부모 POM 설정 파일의 버젼을 고정하는 것이 안전한 접근 방법
나 의존 라이브러리 관리
- 전사적으로 스프링과 junit이 표준이므로 이 라이브러리는 부모에 추가
그 외에도 필요한 것은 대부분 추가하고 자식은 꼭 필요한 라이브러리만 추가
samsung/pom.xml
<properties>
<spring.version>3.0.1.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependencies>
- 메이븐의 의존성 전이나 설정 중복 때문에 같은 라이버러리가 버전이 다르게 추가되거나, 빌드 모듈에 따라 의존 관계 라이브러리가 달라지는 경우가 발생
2차 이상의 계층 구조 프로젝트의 경우
org.springframework:spring-core:jar:3.0.1.RELEASE:compile
+- 생략
- commons-logging:commons-logging:jar:1.1.1:compile
org.hibernate:hibernate:jar:3.2.5.ga:compile
+- 생략
- commons-logging:commons-logging:jar:1.0.1:compile
프로젝트가 복잡할수록 위와 같은 문제가 자주 발생하고, 해결하기 위한 하나의 방법은 메이븐의
dependencyManagement를 활용해 프로젝트에서 사용하는 라이브러리 버전을 고정하는 것
core 에서 commons-logging 의 의존 관계를 명시적으로 추가할때는 무시되는거 같음, 의존성 전이 기능에 의해 중복 될때만 해당 되는거 같음
자식 프로젝트에서 의존성 추가를 할 경우 version은 생략 가능하면, 이 경우 부모에서 정의된 버전이 추가됨
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
- POM 설정 파일에 새 의존 관계를 추가할때는 mvn help:effective-pom 을 실행하여 상위 POM 설정 파일의 dependency Management 설정을 확인하고
필요한 의존 관계가 없는 경우에만 추가
- m2eclipse 의 Dependency Hierarchy 탭에서 의존 관계의 최종 결과 화면을 확인
위에 그림을 보면 왼쪽탭에서 omitted for conflict xxxx 메시지가 나오고 오른쪽 탭에 Resolved Dependencies 가 나온다.
위에 화면은 부모 pom.xml 에서 spring-beans 의존성을 추가하고
core pom.xml 에서 spring-security-aspects 의존성을 추가했을 경우 둘다 spring-core 와 의존 관계를 가짐, 이때
부모 pom.xml 에서의 의존성 전이로 참조 되는 spring-core 버젼과 core 에서 의존성 전이로 참조되는 spring-core 버젼이 달라서
이런 결과가 나옴
dependencyManagement 설정에 spring-core를 정의
다 플러그인 관리
- 이클립스 플러그인의 경우 별도의 설정 없이도 사용 가능
<build>
<finalName>${project.artifactId}</finalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<additionalProjectnatures>
<projectnatures>
org.springframework.ide.eclipse.core.springnature
</projectnatures>
</additionalProjectnatures>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
와 같이 필요한 부분을 plugins 밑에 추가, dependencyManagement 와 비슷한 용도지만, 메이븐 사이트에서 제공하지 않는 플러그인 사용시 반드시
설정을 해 줘야 함
- 이 기능도 상속을 하기 때문에 자식 프로젝트에서는 관련 플러그인만 설정하면 됨, 예를 들어 core 에서 wtp 관련 플러그인을 사용하고 싶다면
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<configuration>
<wtpversion>2.0</wtpversion>
<wtpCotextName>/</wtpContextName>
</configuration>
</plugin>
만 core의 pom.xml에 추가해 주면 됨
3) POM 파일의 효율적인 관리
- 시간이 지날수록 복잡도가 증가, 유지보수가 힘듬, 주기적으로 mvn dependency:analyze 를 실행하여 사용하지 않는 의존 관계를 제거해 나간다면
의존 라이브러리에 대한 관리도 가능
회사에서 스터디를 하는데 문서 보안 때문에 어쩔수 없이 블로그를 이용하게 되었고,
위 내용은 박재성님의 허락을 받았습니다.
12 표준 POM 파일 생성 및 리팩토링
1) 요구사항 분석
- jdk 6.0
- 기반 프레임워크는 스프링
- 퍼시스턴스 계층은 mybatis 또는 hibernaate
- 프리젠테이션 계층은 struts2 또는 스프링 MVC
- 배치는 스프링 배치, 스케줄은 Quartz
- UI는 프리마커 또는 jsp 기반
- 이클립스 환경
- 책의 경우 2중 parent 구조를 가지고 있지만 나는 svn 저장 구조 및 계층 구조가 싫어서 그냥 단순히 만들어 보련다.
. samsung : 전사 공통 설정을 관리 예: 컴파일 옵션
. core : 삼성생명과 관련된 공통 설정을 관리함 예 : 암호화, 보안, 바이러스 등
. user : 일반 사용자 프로젝트
. admin : 관리자 프로젝트
프로젝트 이름을 바꿨음 samsung 빼고 이름을 지음
2) POM 설정 파일 개발
- 디렉토리 구조는
가 각 모듈의 상속, 집합 관계 개발
- 그림1의 상속 구졸르 바탕으로 설정 파일을 개발, samsung 프로젝트는 <packaging/>을 pom 으로 하고
<build>
<finalName>${project.artifactId}</finalName>
</build>
로 함. 이와 같이 하면 이 설정 파일을 상속하는 모든 모듈은 자신의 artifactId를 기준으로 빌드
- core 의 경우 부모 POM 파일을 상속 하므로 groupId, version, packaging 을 따로 설정하지 않으면 부모를 상속
버젼의 경우 특히 한곳에서 관리하는것이 좋음
그치만 여러개의 모듈을 관리할때는 부모 POM 설정의 버젼이 변경될때 자동으로 변경되는 것은 프로젝트의 위험요소 증가 가능성이 큼
따라서 표준 POM 설정을 관리하고 배포할때 부모 POM 설정 파일의 버젼을 고정하는 것이 안전한 접근 방법
나 의존 라이브러리 관리
- 전사적으로 스프링과 junit이 표준이므로 이 라이브러리는 부모에 추가
그 외에도 필요한 것은 대부분 추가하고 자식은 꼭 필요한 라이브러리만 추가
samsung/pom.xml
<properties>
<spring.version>3.0.1.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependencies>
- 메이븐의 의존성 전이나 설정 중복 때문에 같은 라이버러리가 버전이 다르게 추가되거나, 빌드 모듈에 따라 의존 관계 라이브러리가 달라지는 경우가 발생
2차 이상의 계층 구조 프로젝트의 경우
org.springframework:spring-core:jar:3.0.1.RELEASE:compile
+- 생략
- commons-logging:commons-logging:jar:1.1.1:compile
org.hibernate:hibernate:jar:3.2.5.ga:compile
+- 생략
- commons-logging:commons-logging:jar:1.0.1:compile
프로젝트가 복잡할수록 위와 같은 문제가 자주 발생하고, 해결하기 위한 하나의 방법은 메이븐의
dependencyManagement를 활용해 프로젝트에서 사용하는 라이브러리 버전을 고정하는 것
core 에서 commons-logging 의 의존 관계를 명시적으로 추가할때는 무시되는거 같음, 의존성 전이 기능에 의해 중복 될때만 해당 되는거 같음
자식 프로젝트에서 의존성 추가를 할 경우 version은 생략 가능하면, 이 경우 부모에서 정의된 버전이 추가됨
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
- POM 설정 파일에 새 의존 관계를 추가할때는 mvn help:effective-pom 을 실행하여 상위 POM 설정 파일의 dependency Management 설정을 확인하고
필요한 의존 관계가 없는 경우에만 추가
- m2eclipse 의 Dependency Hierarchy 탭에서 의존 관계의 최종 결과 화면을 확인
위에 그림을 보면 왼쪽탭에서 omitted for conflict xxxx 메시지가 나오고 오른쪽 탭에 Resolved Dependencies 가 나온다.
위에 화면은 부모 pom.xml 에서 spring-beans 의존성을 추가하고
core pom.xml 에서 spring-security-aspects 의존성을 추가했을 경우 둘다 spring-core 와 의존 관계를 가짐, 이때
부모 pom.xml 에서의 의존성 전이로 참조 되는 spring-core 버젼과 core 에서 의존성 전이로 참조되는 spring-core 버젼이 달라서
이런 결과가 나옴
dependencyManagement 설정에 spring-core를 정의
다 플러그인 관리
- 이클립스 플러그인의 경우 별도의 설정 없이도 사용 가능
<build>
<finalName>${project.artifactId}</finalName>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<additionalProjectnatures>
<projectnatures>
org.springframework.ide.eclipse.core.springnature
</projectnatures>
</additionalProjectnatures>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
와 같이 필요한 부분을 plugins 밑에 추가, dependencyManagement 와 비슷한 용도지만, 메이븐 사이트에서 제공하지 않는 플러그인 사용시 반드시
설정을 해 줘야 함
- 이 기능도 상속을 하기 때문에 자식 프로젝트에서는 관련 플러그인만 설정하면 됨, 예를 들어 core 에서 wtp 관련 플러그인을 사용하고 싶다면
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<configuration>
<wtpversion>2.0</wtpversion>
<wtpCotextName>/</wtpContextName>
</configuration>
</plugin>
만 core의 pom.xml에 추가해 주면 됨
3) POM 파일의 효율적인 관리
- 시간이 지날수록 복잡도가 증가, 유지보수가 힘듬, 주기적으로 mvn dependency:analyze 를 실행하여 사용하지 않는 의존 관계를 제거해 나간다면
의존 라이브러리에 대한 관리도 가능
'빌드 > maven' 카테고리의 다른 글
Maven 13장 - 메이븐 아키타입 (0) | 2012.03.15 |
---|---|
Maven 11장 - 메이븐 사내 저장소 설치 및 활용 (0) | 2012.03.14 |
Maven 10장 - 메이븐 모듈 (0) | 2012.03.14 |
Maven 9장 - 리포팅 기능을 활용한 문서 관리 (0) | 2012.03.05 |
Maven 8장 - 메이븐 프로파일, 배포 (0) | 2012.03.05 |