이 내용은 박재성님이 집필하신 [자바 세상의 빌드를 이끄는 메이븐] 책을 그대로 정리한 것이다.
회사에서 스터디를 하는데 문서 보안 때문에 어쩔수 없이 블로그를 이용하게 되었고,
위 내용은 박재성님의 허락을 받았습니다.

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 를 실행하여 사용하지 않는 의존 관계를 제거해 나간다면
     의존 라이브러리에 대한 관리도 가능
    
 
      
 



































Posted by gt1000

블로그 이미지
gt1000

태그목록

공지사항

어제
오늘

달력

 « |  » 2024.3
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

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함