날짜별 글 목록: 2010년 3월 15일

build.xml refactoring using macrodef tag

The ThoughtWorks Anthology 라는 책의 11 챕터의 빌드 아케텍트인 줄리안 심슨님의 내용은, build.xml 즉, ant 파일이 refactoring에 대한 내용입니다.  그 중에서, <macrodef> 태그를 이용한 build.xml 파일의 리펙토링 예제가 나오는데, 유용할것 같아서 개인적으로 사용하고 있는 dist target에 대해서 리펙토링을 적용해 봤습니다.

기존

<!– distribute compiled binary to dist folder –>
    <target name=”dist” depends=”compile” description=”distribute library”>
        <echo>dist target started</echo>
        <jar destfile=”${dist.dir}/${project.name}-${project.version}.jar”>
            <fileset dir=”${build.main.classes}”></fileset>
           
            <manifest id=”MANIFEST.MF”>
                 <attribute name=”Built-By” value=”${user.name}”/>
                 <!–attribute name=”Class-Path” value=”${class-path}” /–>   
             </manifest>
        </jar>
       
        <copy todir=”${dist.dir}”>
            <fileset dir=”${lib.dir}”>
                <exclude name=”junit*.jar” />
            </fileset>
        </copy>
       
        <!– compress binary –>
        <zip destfile=”${dist.dir}/${project.name}-${project.version}.zip” >
            <fileset dir=”${dist.dir}” includes=”**” />
        </zip>
        <echo>dist target completed</echo>
    </target>   

리펙토링된 후

    <macrodef name=”dist_jar”>
        <sequential>
            <jar destfile=”${dist.dir}/${project.name}-${project.version}.jar”>
                <fileset dir=”${build.main.classes}”></fileset>
                <manifest id=”MANIFEST.MF”>
                    <attribute name=”Built-By” value=”${user.name}”/>
                    <!–attribute name=”Class-Path” value=”${class-path}” /–>   
                </manifest>
            </jar>
        </sequential>
    </macrodef>
   
    <macrodef name=”dist_copy”>
        <sequential>
            <copy todir=”${dist.dir}”>
                <fileset dir=”${lib.dir}”>
                    <exclude name=”junit*.jar” />
                </fileset>
            </copy>
        </sequential>
    </macrodef>
   
    <macrodef name=”dist_zip”>
        <sequential>
            <!– compress binary –>
            <zip destfile=”${dist.dir}/${project.name}-${project.version}.zip” >
                <fileset dir=”${dist.dir}” includes=”**” />
            </zip>       
        </sequential>
    </macrodef>
   
    <!– distribute compiled binary to dist folder –>
    <target name=”dist” depends=”compile” description=”distribute library”>
        <echo>dist target started</echo>
        <dist_jar />
        <dist_copy />
        <dist_zip />
        <echo>dist target completed</echo>
    </target>   

위 예제처럼, 리펙토링된 내용을 살펴보면, <macrodef>태그를 통해서 기능에 대한 내용을 작게 쪼개서 빼고(<macrodef>) , 사용하는 <target>에서는 필요한 각 기능을 호출하는 템플릿 메쏘드(?)처럼 기술하게 됩니다. 어디서 많이 본 느낌인데.. 위는 기능을 작게 나눠서 메쏘드로 뽑는 extract method 리렉토링 기법과 동일하네요.. 역시 대가들에게서 많은 내용을 배우게 되는것 같습니다. ^^