이전 글에서 리소스 설정치환 방법에 대해 얘기했습니다. 그럼 메이븐 환경에서 리소스 설정치환 작업은 어떤 phase에서, 어떤 리소스를 대상으로 이루어져야 할까요?

1. 클래스패스에 포함되는 리소스

(1) 리소스 필터링 방식
메이븐이 process-resource 단계에서 타겟 디렉토리로 복사된 리소스를 대상으로 필터링을 해줍니다. 이때 원본 리소스는 변경이 없습니다. 그러니까 /src/jdbc.properties 파일에 password=${jdbc.password} 처럼값을 설정해놓으면 /target/classes/jdbc.properties 파일에는 그 부분이 password=my_password 식으로 바뀌어 있다는 말입니다.

(2) 리소스 교체 방식
타겟 디렉토리에 복사된 리소스 파일에 대해서 교체 처리해줍니다. 어차피 process-resource 단계에서는 resources:resources 골이 가장 먼저 실행되기 때문에 교체 작업(ant의 copy 타스크 이용)은 그냥 process-resources 단계에 바인딩하면 됩니다. 역시 원본 리소스 파일은 변경이 없습니다. 예를 들어 /src 밑의 jdbc.properties와 jdbc.properties.dev가 /target/classes 밑에 복사된 후 /target/classes/jdbc.properties.dev 파일이 /target/classes/jdbc.properties 파일을 덮어쓰게 됩니다.

 

2. WEB-INF 밑에 있는 리소스(web.xml, struts-config.xml, applicationContext.xml 등등)

WEB-INF 밑의 리소스에 대한 설정치환은 좀 지저분합니다. 
메이븐은 package 단계에서 war:war를 실행하는데, war:war는 무조건 war:exploded 를 먼저 실행하고 나서 exploded된 웹어플리케이션을 war 파일로 묶어냅니다. 우리가 원하는 것은 exploded 된 웹어플리케이션의 리소스 파일에 대해 리소스설정치환 작업을 하고나서 war 파일로 패키징하는 것인데, 중간에 끼어들 여지가 원천 봉쇄된 것입니다.

뭐 package 단계나 war:war를 실행하지 않으면 되긴합니다. war:exploded를 명시적으로 실행한 뒤에 설정치환을 하면 됩니다. 그런데 설정치환하는 execution을 어느 phase에 바인딩하는게 좋을지... 하여간 원본 리소스 파일을 건드리지 않은 상태로 리소스 치환을 하려니 지저분해지는군요.

만약 원본 리소스를 건드려도 무방하다면 package 전 단계(prepare-package 단계는 maven 2.1부터 지원하기 때문에 2.1 이전 버전이라면 process-resources 단계가 괜찮을까요)에서 원본 리소스를 대상으로 설정치환 작업을 처리하면 됩니다. 
신고
Posted by 에코지오

댓글을 달아 주세요

메이븐에 대해 많은 사람들이 토로하는 불만중의 하나가 프로퍼티를 외부 파일에서 읽어오는 기능이 없다는 점이다.

기본적으로 메이븐에서 프로퍼티는 실행시 -Dxxx=yyy 식으로 넘겨주거나 <properties> 엘리먼트에 <xxx>yyy</xxx> 식으로 설정할 수 있다.

Ant는 간단히 <property file="jdbc.properties" /> 식으로 외부 프로퍼티 파일에서 값을 읽어올 수가 있는데 메이븐에는 이런 간단한 것조차 안된다는 점이 많이 실망스럽기도 하다.

그래서인가 누군가 properties-maven-plugin이라는 플러그인을 만들었는데 http://snapshots.repository.codehaus.org 레포지토리에서 받을 수 있다.
(2007년 이후로 별다른 업데이트는 없다...)

   <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>
    <executions>
     <execution>
      <phase>initialize</phase>
      <goals>
       <goal>read-project-properties</goal>
      </goals>
      <configuration>
       <files>
        <file>jdbc.properties</file>
       </files>
      </configuration>
     </execution>
    </executions>
   </plugin>

그러나 기대는 아직 이르다. 이 플러그인에는 치명적인 문제가 있다. 
properties 파일에 설정한 프로퍼티를 플러그인 및 의존성의 설정(configuration) 항목에 사용할 수 없다는 것이다.
젠장.

신고
Posted by 에코지오

댓글을 달아 주세요



티스토리 툴바