자바소스를 올려 두고 ant를 이용하면 손쉽게 모든 파일을 컴파일/실행/복사/jar 생성 등을 할 수 있습니다.

관련 한 글을 퍼다가 아래에 담습니다. 다른  언어도 되는지는 잘 모르겠습니다. 일단 지금 하고 있는 자바

개발 건에는 약간 도움이 될려고 하고 있습니다. 다음 장엔 ant의 옵션에 대해서 아래 보다 자세히 정리 하도록

하겠습니다.

▩ Eclipse ANT(Another Neat Tool)

   – http://ant.apache.org

   – XML 기반으로 자바 파일의 컴파일 및 압축, 배포, 복사등의 작업을
     운영체제에 상관없이 실행할 수 있습니다.

   – XML 기반이라 기초적인 XML문법만 알면 배우고 사용하기 쉽습니다.

   – Ant자체 내에는 JVM이 별도로 운영이 되어 java 컴파일, jar 패키징 작업을
     자체적으로 수행한다.

   – EJB Compile과 패키징 작업 그리고 J2EE 개발을 지원하는 기능(XML스크립트 자동생성)이
     내장되어 있다.

   – FTP, Telnet, Application Server, SQL 명령어들을 배치 자동화에 사용할 수 있다.

   – 용어
     . TASK: ANT에서 지원화는 작업의 단위
     . TARGET: TASK의 집합으로 구성되어 있는 작업 단위

   – 속성의 정의
     <property name=”build.dir” value=”./bin”/>

     위 문장은 String build.dir = “./bin”과 같습니다.

   – ${ } :선언된 속성을 가져다 사용합니다.

   – Eclipse의 ANT Plugin
     . eclipse 2.X 에는 Ant 1.5.3버전이 포함되어 있습니다.
     . eclipse 3.X 에는 Ant 1.6.5버전이 포함되어 있습니다.

    

▩ 기본 태스크의 이해 및 태스크의 실습

   – eclipse에서 [java project]를 이용
     . project name : helloAnt(or ejb_c15_HelloAnt)
     . source folder: src
     . output folder: bin
     . package name : helloAnt
     . build xml file folder: build
     

1. java 태스크
   – 컴파일된 자바 프로그램을 실행합니다.

>>>>> HelloAnt.java

package helloAnt;

public class HelloAnt {

    public static void main(String[] args) {
        System.out.println(“—————“);
        System.out.println(“Hello Ant!”);
        System.out.println(“—————“);
    }
}

>>>>> build/build.xml
     
<?xml version=”1.0″ encoding=”euc-kr” ?>
<project name=”helloAnt” default=”execute” basedir=”.”>
    <!–속성, 변수, 현재 build 폴더임으로 상위 폴더로 이동 –>
    <property name=”build.dir” value=”../bin” />

    <!–타겟–>
    <target name=”execute”>
        <!–자바 실행 태스크–>
        <java classpath=”${build.dir}” classname=”helloAnt.HelloAnt”>
        </java>
    </target>

</project>

– Eclipse에서의 실행
  Context 메뉴에서 ‘Ant Build’합니다.

2. javac 태스크
   – 자바 프로그램을 컴파일합니다.
     <javac srcdir= “${src.dir}” — 소스 폴더 지정
     destdir=”${build.dir}”      — 컴파일되어 저장될 폴더
     includes=”**/*.java”        — 컴파일할 파일 패턴, **: 모든 하위 폴더 포함
     excludes=”**/*.class”       — 컴파일에서 제외할 파일 패턴
     classpath=”${classpath}”    — 컴파일시 클래스 참조 경로
     />

>>>>> build2.xml

<?xml version=”1.0″ encoding=”euc-kr” ?>

<!–default: 처음 시작 target 지정–>
<project name=”helloAnt” default=”execute” basedir=”.”>
    <!–소스 디렉토리–>
    <property name=”src.dir” value=”../src”/>
    <!–컴파일 되서 class로 변환되어 들어갈 경로–>
    <property name=”build.dir” value=”../bin”/>
    <!–컴파일시 참조할 경로–>
    <property name=”classpath” value=”../bin”/>

    <target name=”compile”>
        <javac srcdir= “${src.dir}”
        destdir=”${build.dir}”
        includes=”**/*.java”
        excludes=”**/*.class”
        classpath=”${classpath}”
        />
    </target>

    <!–depends:의존하는 태스크를 지정하며 나중에 실행됩니다.–>
    <target name=”execute” depends=”compile”>
        <java classpath=”${build.dir}” classname=”helloAnt.HelloAnt”>
        </java>
    </target>
</project>

3. jar 태스크
   – 관련파일을 압축하여 ‘*.jar’파일을 생성합니다.
   – fork옵션에서 true을 지정해 새로운 VM을 실행해주어야만 가능하다.
     <target name=”create_manifest” depends=”compile”>
         <manifest file=”${src.dir}/MANIFEST.MF”>  — jar 파일 명세서
             <attribute name=”Built-By” value=”${user.name}”/>
             <!–jar압축파일에서 처음으로 실행을 시작하는 클래스–>
            <attribute name=”Main-Class” value=”${main.class}”/>
         </manifest>
     </target>

     <target name=”jars” depends=”create_manifest”>
         <!– ./helloAnt2.jar –>
         <jar
  destfile=”${basedir}/${jars.name}” — 만들어질 jar 파일명
         basedir=”${build.dir}”             — 압축할 디렉토리
         includes=”**/*.class”              — 압축할 파일 패턴 지정
         excludes=”**/*.java”               — 압축에서 제외할 파일
         compress=”true”                    — 압축 옵션
         update=”true”                      — 기존에 존재하면 덮어씀
        index=”true”                        — 압축 목록 생성
         manifest=”${src.dir}/MANIFEST.MF”> — Manifest 파일 지정
          <!–압축할 파일들–>
             <fileset dir=”${build.dir}”/>  — 압축할 파일 집합 지정
         </jar>
     </target>  

     <target name=”execute” depends=”jars”>
         <!–./helloAnt.jar–>
         <java jar=”${basedir}/${jars.name}” — 실행할 jar 파일명
         fork=”true”                         — 새로운 JVM 실행
         failonerror=”true”                  — 에러 발생시 실패 처리
         maxmemory=”128m”
         />
     </target>

>>>>> build3.xml

TASK Sequence: execute —> jars —> create_manifest —> compile
                       <—      <—                 <— return   

<?xml version=”1.0″ encoding=”euc-kr” ?>

<project name=”helloAnt” default=”execute” basedir=”.”>
    <property name=”project.name” value=”${ant.project.name}”/>
    <property name=”project.version” value=”1.0″/>
    <!–실행을 시작하는 메인 클래스–>
    <property name=”main.class” value=”helloAnt.HelloAnt”/>
    <!–압축파일 이름 helloAnt2.jar –>
    <property name=”jars.name” value=”${ant.project.name}.jar”/>
    <!–컴파일할 소스가 있는 디렉토리–>
    <property name=”src.dir” value=”../src”/>
    <!–컴파일되어 class로 변경되어 들어갈 폴더–>
    <property name=”build.dir” value=”../bin”/>
    <!–컴파일시 참조할 클래스 폴더–>
    <property name=”classpath” value=”../bin”/>
    <property name=”user.name” value=”개발자”/>

    <target name=”compile”>
        <javac srcdir= “${src.dir}”
        destdir=”${build.dir}”
        includes=”**/*.java”
        excludes=”**/*.class”
        classpath=”${classpath}”
        />
    </target>

    <target name=”create_manifest” depends=”compile”>
        <manifest file=”${src.dir}/MANIFEST.MF”>
            <attribute name=”Built-By” value=”${user.name}”/>
            <!–jar압축파일에서 처음으로 실행을 시작하는 클래스–>
            <attribute name=”Main-Class” value=”${main.class}”/>
        </manifest>
    </target>

    <target name=”jars” depends=”create_manifest”>
        <!– ./helloAnt.jar –>
        <jar destfile=”${basedir}/${jars.name}”
        basedir=”${build.dir}”
        includes=”**/*.class”
        excludes=”**/*.java”
        compress=”true”
        update=”true”
        index=”true”
        manifest=”${src.dir}/MANIFEST.MF”>
         <!–압축할 파일들–>
            <fileset dir=”${build.dir}”/>
        </jar>
    </target>

    <target name=”execute” depends=”jars”>
        <!–./helloAnt.jar–>
        <java jar=”${basedir}/${jars.name}”
        fork=”true”
        failonerror=”true”
        maxmemory=”128m”
        />
    </target>

</project>

4. copy, echo, delete, mkdir 태스크
   – copy: 파일을 복사합니다.
   – delete: 파일을 삭제합니다.
   – mkdir: 디렉토리를 생성합니다.

>>>>> build4.xml
TASK Sequence: start.copy –> execute –> jars –> javadoc –> create_manifest –> compile
                          <–         <–      <–         <–                 <– return     

<?xml version=”1.0″ encoding=”euc-kr” ?>

<project name=”helloAnt” default=”start.copy” basedir=”.”>
    <property name=”project.name” value=”${ant.project.name}”/>
    <property name=”project.version” value=”1.0″/>
    <!–실행을 시작하는 메인 클래스–>
    <property name=”main.class” value=”helloAnt.HelloAnt”/>
    <!–압축파일 이름–>
    <property name=”jars.name” value=”${ant.project.name}.jar”/>
    <!–컴파일할 소스가 있는 디렉토리–>
    <property name=”src.dir” value=”../src”/>
    <!–컴파일되어 class로 변경되어 들어갈 폴더–>
    <property name=”build.dir” value=”../bin”/>
    <property name=”classpath” value=”../bin”/>
    <property name=”user.name” value=”개발자”/>
    <property name=”backup.dir” value=”backup”/>

    <target name=”compile”>
        <javac srcdir= “${src.dir}”
        destdir=”${build.dir}”
        includes=”**/*.java”
        excludes=”**/*.class”
        classpath=”${classpath}”
        />
    </target>

    <target name=”create_manifest” depends=”compile”>
        <manifest file=”${src.dir}/MANIFEST.MF”>
            <attribute name=”Built-By” value=”${user.name}”/>
         <!–jar압축파일에서 처음으로 실행을 시작하는 클래스–>
            <attribute name=”Main-Class” value=”${main.class}”/>
        </manifest>
    </target>

    <target name=”jars” depends=”create_manifest”>
        <!– ./helloAnt2.jar –>
        <jar destfile=”${basedir}/${jars.name}”
        basedir=”${build.dir}”
        includes=”**/*.class”
        excludes=”**/*.java”
        compress=”true”
        update=”true”         
        index=”true”
        manifest=”${src.dir}/MANIFEST.MF”>
         <!–압축할 파일들–>
            <fileset dir=”${build.dir}”/>
        </jar>
    </target>

    <target name=”execute” depends=”jars”>
    <!–./helloAnt.jar–>
        <java jar=”${basedir}/${jars.name}”
        fork=”true”
        failonerror=”true”
        maxmemory=”128m”
        />
    </target>

    <target name=”start.copy” depends=”execute”>
        <!–폴더를 생성합니다.–>
        <mkdir dir=”${backup.dir}”/>
        <!–기본 디렉토리에 생성된 jar파일을 backup 폴더로 복사합니다.–>
        <copy file=”${basedir}/${jars.name}” todir=”${backup.dir}” overwrite=”true”/>
        <!–기본 디렉토리에 생성된 jar파일을 삭제합니다.–>
        <delete file=”${basedir}/${jars.name}”/>
    </target>
</project>

5. property를 다른 파일로 분리한 경우
   – 속성을 지정시 불필요한 공백이 추가되면 경로가 인식이 안되며 특히 문장의 뒤에
     공백이 있으면 안됩니다.

>>>>> build.properties

#———————————————————
# build5.properties
#———————————————————
project.name=${ant.project.name}
project.version=1.0
main.class=helloAnt.HelloAnt
jars.name=${ant.project.name}.jar
src.dir=../src
build.dir=../bin
classpath=../bin
user.name=Developer1
backup.dir=../backup

>>>>> build5.xml

<?xml version=”1.0″ encoding=”euc-kr” ?>

<project name=”helloAnt” default=”start.copy” basedir=”.”>
    <property file=”./build.properties”/>
   
    <target name=”compile”>
        <javac srcdir= “${src.dir}”
        destdir=”${build.dir}”
        includes=”**/*.java”
        excludes=”**/*.class”
        classpath=”${classpath}”
        />
    </target>

    <target name=”create_manifest” depends=”compile”>
        <manifest file=”${src.dir}/MANIFEST.MF”>
            <attribute name=”Built-By” value=”${user.name}”/>
         <!–jar압축파일에서 처음으로 실행을 시작하는 클래스–>
            <attribute name=”Main-Class” value=”${main.class}”/>
        </manifest>
    </target>

    <target name=”jars” depends=”create_manifest”>
        <!– ./helloAnt2.jar –>
        <jar destfile=”${basedir}/${jars.name}”
        basedir=”${build.dir}”
        includes=”**/*.class”
        excludes=”**/*.java”
        compress=”true”
        index=”true”
        manifest=”${src.dir}/MANIFEST.MF”>
         <!–압축할 파일들–>
            <fileset dir=”${build.dir}”/>
        </jar>
    </target>

    <target name=”execute” depends=”jars”>
    <!–./helloAnt2.jar–>
        <java jar=”${basedir}/${jars.name}”
        fork=”true”
        failonerror=”true”
        maxmemory=”128m”
        />
    </target>

    <target name=”start.copy” depends=”execute”>
        <!–폴더를 생성합니다.–>
        <mkdir dir=”${backup.dir}”/>
        <!–기본 디렉토리에 생성된 jar파일을 backup 폴더로 복사합니다.–>
        <copy file=”${basedir}/${jars.name}” todir=”${backup.dir}” overwrite=”true”/>
        <!–기본 디렉토리에 생성된 jar파일을 삭제합니다.–>
        <delete file=”${basedir}/${jars.name}”/>
    </target>
</project>

직접 사용한 예제;

<?xml version=”1.0″ encoding=”euc-kr” ?>
<!–default: 처음 시작 target 지정–>
<project name=”mytest” default=”compile” basedir=”.”>
    <!–소스 디렉토리–>
    <property name=”src.dir” value=”../src”/>
    <!–컴파일 되서 class로 변환되어 들어갈 경로–>
    <property name=”build.dir” value=”../bin”/>
    <!–컴파일시 참조할 경로–>
    <property name=”classpath” value=”../bin”/>

    <target name=”compile” depends=”start.copy”>
        <javac srcdir= “${src.dir}”
        destdir=”${build.dir}”
        includes=”**/*.java”
        excludes=”**/*.class”
        classpath=”${classpath}:../lib/jvftplib.jar:../lib/ojdbc14.jar”
        />
    </target>
   
    <target name=”start.copy” >
        <!–BIN 디렉토리 생성.–>
        <mkdir dir=”${build.dir}” />
       
        <!–src 의 xml 리소스 파일 복사.–>
        <copy todir=”${build.dir}/com/juice/onm/xml/resource”
                overwrite=”true”
                includeEmptyDirs=”true”
                flatten=”false”>               
        <fileset dir=”../src/com/juice/onm/xml/resource” />
        </copy>
    </target>
</project>

실행

java -jar xxxxxx.jar

Leave a Reply

Your email address will not be published. Required fields are marked *