본문 바로가기
IT/Maven

maven-resource-plugin: Filtering

by yjacket 2013. 6. 7.

메이븐 리소스 필터링?

Filtering -> 흔히 '걸러내기'라고 이해하고 있기 때문에

jar 패키징시 .properties 파일등을 빼내는 건 줄 알았지만 그것은 함정!


핸..핸드드립!!! 출처: http://blog.naver.com/PostView.nhn?blogId=adsl4860&logNo=70110339277


필터링의 진실을 다음 sample pom.xml 을 보면서 간단히 설명하겠습니다.

<filter>태그에서 db 접속정보가 들어있는 속성파일을 필터로 지정하면

<resource>태그 아래서 filtering=true 를 통해

<directory>태그와 <include>태그로 지정한 (텍스트로 된)리소스안에 

${...}형식으로 되어 있는 표기된 부분이 필터로 지정한 속성파일안에 지정한 값으로 치환됩니다. 

또, pom.xml의 properties 태그로 지정한 속성이나 maven의 기본 속성변수인 ${basedir}, ${project.build.finalName}등은 필터지정 없이도 사용 할 수 있어요.


단, filtering 기본값은 false 이기 때문에 filtering=true 를 지정하지 않으면 당연히 바뀌지 않는점, 텍스트파일이 아닌 바이너리 등은 바뀌지 않는것에 유의해주세요.


활용

우리는 흔히 myBatis 의 환경설정파일(db.config.xml)에 db접속 정보를 그대로 기록합니다.

하지만, DB접속 정보는 개발자마다 달라질 수 있어서 이런 파일은 저장소에 커밋하지 않습니다.

그러나 이 파일안에는 접속정보외에도 어플리케이션의 안정적 운영을 위한 설정도 함께 들어있어 커밋에서 제외하기도 힘듭니다.

궁여지책으로 '템플릿'역할을 하는 파일을 만들어 이를 커밋한 후 각 개발자가 이 파일이름을 수정한 후 자신의 접속 정보를 설정해 사용하지만 종종 실수한 커밋이 올라오는 경우도 많아서 혼란스러울 때가 많습니다.


위 문제는 필터링을 이용하면 좀 더 안전하게? 해결 할 수 있습니다.


다시 한번 위 예시를 봅시다. 

필터로 지정된 db.config.properties 에는 DB접속 설정만을 기록합니다.

그리고 myBatis 가 사용하는 db.config.xml은 리소스로 지정한 src/main/resources/ 에 위치시킵니다.

마지막으로 db.config.xml 안에 DB접속 정보가 들어간 부분을 db.config.properties의 속성으로 바꿔주고 이클립스에서 실행하면

maven 에 의해 빌드타임에 db.config.xml 안에 ${...}로 표기된 부분이 db.config.properties 에 지정된 값으로 치환됩니다.


이제 db.config.xml 파일을 맘놓고 커밋 할 수 있겠군요!


또 다른 활용사례로 저는 jar 실행을 위해 만든 배치파일인 run.bat 에 다음과 같이 적용했습니다.


src/main/resources/run.bat (필터링안된 소스)

java -jar *${project.build.finalName}*.jar


target/jar/run.bat (필터링됨)

java -jar *imonLope-1.0-SNAPSHOT*.jar

참고: http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html