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 리렉토링 기법과 동일하네요.. 역시 대가들에게서 많은 내용을 배우게 되는것 같습니다. ^^


'tools' 카테고리의 다른 글

java c/c++, c# 호출방식  (0) 2010/04/29
eclipse에서 java source 보기  (0) 2010/03/16
build.xml refactoring using macrodef tag  (1) 2010/03/15
staruml  (0) 2010/02/08
FindBugs 사용하기..  (0) 2010/02/02
Tag // Ant, Refactoring

Ant with proguard obfuscate tool

from tools 2008/07/09 14:14
프로그램을 개발하다보면, 개인일 경우에는 상관이 없지만, 회사에서 회사로 상용으로 제공하는 컴포넌트나 라이브러리 같은 경우에는 최소한의 코드 보안은 필수입니다.

특히나 java의 경우에는 decompile이 잘 되는 구조이기 때문에, obfuscate는 꼭 필요하지는 않지만, 사용할 필요가 있습니다.

obfuscate 툴은 상용 버전들과 오픈소스 버전들이 있는데..
아래의 예제는 오픈소스인 proguard를 프로젝트 빌드파일인 build.xml에서 쉽게 사용하고 있는 예제입니다.

<taskdef="proguard" classname="proguard.ant.ProGuardTask" classpath="${lib-ext}/proguard.jar" />
<task name="dist-with-obfuscate" depends="compile" >
  <proguard>
        -libraryjars ${java.home}/lib/rt.jar <-- java library
        -injars maked-jar.jar  <-- jar task로 만들어진 원본 jar 파일
        -outjar maked.jar <-- 만들어질 jar 파일
        -keep class net.sjava.obfuscate.TestMain { public *; } <-- main 클래스의 public은 예외
        -verbose <-- 과정을 화면에 뿌림
  </proguard>
</task>
더 자세한 내용은 http://proguard.sourceforge.net/manual/examples.html 에서 참고를 하세요.. ^^

'tools' 카테고리의 다른 글

java decompiler  (0) 2008/07/24
Sun xVM VirtualBox  (0) 2008/07/09
Ant with proguard obfuscate tool  (0) 2008/07/09
jad decompiler 사용하기..  (0) 2008/06/26
eclipse에서 ant ftp task 사용하기  (0) 2008/06/26
ANT로 빌드파일(build.xml)을 만들고, 빌드파일을 통해서 컴파일된 바이너리를 FTP로 전송할 수 있는 기능이 있습니다. 단계는 아래와 같습니다.

1. ftp 라이브러리 설치
  http://commons.apache.org/net/의 최신버전을 다운로드 받습니다.
  다운로드 받은 라이브러리인 commons-net-1.x.x.jar 파일을 이클립스가 설치된 폴더/plugins/ant설치버전/lib 폴더에 카피를 합니다. 참고로, 현재 최신버전은 commons-net-1.4.1 이네요.. ^^

2. eclipse ant classpath 세팅
  Eclipse->Window->Preferences->Ant->Runtime->Classpath->Add External JARS를 통해서 commons-net-1.x.x.jar를 Classpath에 등록한다

3. 실행
  <ftp server="ftp.yourserver.com" userid="anonymous" password="me@yourserver.com">
    <fileset dir="yourdir/youdocs" />
  </ftp>

ant의 ftp task에 대한 자세한 내용은 http://ant.apache.org/manual/OptionalTasks/ftp.html 에서 참고를 하시면 됩니다. ^^

'tools' 카테고리의 다른 글

Ant with proguard obfuscate tool  (0) 2008/07/09
jad decompiler 사용하기..  (0) 2008/06/26
eclipse에서 ant ftp task 사용하기  (0) 2008/06/26
vi 컨닝 페이퍼 이용하기  (0) 2008/06/25
eclipse 에서 argouml 사용하기..  (0) 2008/06/19
Ant로 프로젝트를 빌드할 경우, 의존관계에 있는 프로젝트도 새롭게 빌드하기 위해서는,메인 빌드파일에서 다른 빌드파일의 task를 실행시켜 줘야 합니다.

<target name="appc">
  <ant antfile="${build.dir}/ant/utilities.xml" inheritAll="true" target="appc">
    <property name="classpath" refid ="${appserver}.path"/>
    <property name="appcMemory" value="256m"/>
  </ant>
</target>
Tag // Ant, apache ant