2009. 10. 18. 00:29
IT
최근 모 PJT에서 윈도우용으로 설정된 property와 빌드파일의 내용을 변경하지 않고
Unix(AIX)에서 사용할수 있도록 요청받은 일이 있었다.
통상의 대응방법은 Unix에서 사용하기 위해 별도의 빌드파일과 프로퍼티 파일을 생성하여 대응하는 편이었는데,
이런 방식의 단점은 관리대상이 늘어나고, 복잡도가 커지는 것이다.
그래서 ANT 나라 사람들은 어떻게 이문제를 해결하나 싶어 둘러보았다.
- os.name 값을 활용한다.
http://java.sun.com/j2se/1.3/docs/api/java/lang/System.html#getProperties()
예) <property file="${os.name}.properties"/>
이경우 XP 는 "Windows XP" , AIX 는 "AIX" 로 출력된다.
더 상세한 내용은 아래를 참고바란다.
http://mail-archives.apache.org/mod_mbox/ant-user/200401.mbox/<4015565A.2080009@corvil.com>
아쉬운 점은 os.family 값은 존재하지 않는다는 것이다.
os.name 은 같은 윈도우라도 Windows XP, Windows 2000 등 공백을 포함한 각기 다른 OS명을 반환한다. - condition task를 이용하여 구별한다.
예) <condition property="iswindows"> <os family="windows"/> </condition> <target name="windows.init" if="iswindows">
http://ant.apache.org/manual/CoreTasks/condition.html
이 방식을 사용할 경우의 문제점은 condition에 따라 특정 target에서 antcall을 하여 property를 os에 따라 setting 할 경우 변수값이 공유되지 않는 다는 것이다.
아래와 같은 경우 window.properties 에 존재하는 변수들은 all target에서 인식되지 않는다.
<target name="window" if="iswindows">
<antcall target="window.init"/>
</target>
<target name="window.init"/>
<property file="window.properties"/>
</target>
<target name="all" depends="window"/>
그래서 해결한 방법은 다음과 같다.
<property file="${os.name}.properties"/> <!-- unix 환경 -->
<property file="default.properties"/> <!-- window 환경 -->
특정 OS환경에 따른 변수값을 먼저 설정하도록 지정한 것인데,
일반적인 통념과는 달리, ANT는 property에 값이 먼저 셋팅되면 다음에 무엇이 오더라도 변경이 되지 않는 것으로 보인다.
즉 default.properties 에 같은 이름의 변수가 있다 하더라도, 해당하는 {os.name}.properties 의 변수가 고정으로 사용된다는 것이다.
결과적으로 윈도우 개발자들은 항상 default.properties 를 탈 것이고,
Unix 환경에서는 Unix OS (AIX, Linux, HP-UX, SunOS ) 설정 파일이 지정한 값에 따라 선택 될 것이다.
그래서 문제 해결~~~ (이것때문에 몇시간 헤멨다.. )
이 글은 스프링노트에서 작성되었습니다.