2012年11月26日 星期一

《Stocktotal》之二:使用 Apache Ant build tool

Apache Ant is a software tool for automating software build processes. It is similar to Make but is implemented using the Java language, requires the Java platform, and is best suited to building Java projects.


這裡我說明怎麼從 Eclipse build process 移植到 Apache Ant build process。


StocktotalReport 目錄結構:
build.xml
config/ReportGenerator.config
config/StocktotalReport.jrxml
lib/commons-beanutils-1.8.0.jar
lib/commons-collections-2.1.1.jar
lib/commons-configuration-1.9.jar
lib/commons-digester-2.1.jar
lib/commons-logging-1.1.1.jar
lib/groovy-all-2.0.1.jar
lib/jasperreports-4.8.0.jar
lib/jcommon-1.0.15.jar
lib/jfreechart-1.0.12.jar
lib/postgresql-9.2-1002.jdbc3.jar
lib/commons-lang-2.6.jar
lib/commons-cli-1.2.jar
lib/log4j-1.2.17.jar
src/stocktotal/report/Argparser.java
src/stocktotal/report/Program.java
src/stocktotal/report/ReportGenerator.java
src/log4j.xml


Build processes 大致包括幾個流程:
  1. Clean building environment
  2. Compile Java source code to Java classes
  3. Pack classes to a single jar file
第一步沒什麼問題。

第二步最常漏掉的就是把 log4j.xml 一起複製到 classes directory

第三步打包,把 classes directory ((當然包括 log4j.xml)) 全部包成一個 jar 檔,放在 destination directory,這樣還不夠,還要把 lib 目錄下所有的 library 全部 copy 到 destination directory,再把 config 目錄下所有的設定 copy 到 destination directory,將來才好執行


打包 jar 檔要額外設定兩件事:
  • Main Class: stocktotal.report.Program ((程式從哪個 class 的 public static main(String[]) 開始執行))
  • Class Path: lib 底下所有的 library。
這步驟不能忘記。


把以上想法寫成 build process,就是下面的流程。Apache Ant 利用 depends 寫明 build process,有倒敘法的味道。
<?xml version="1.0" encoding="UTF-8"?>
    
<project name="StocktotalReport" basedir="." default="jar">

    <property name="src.dir" value="src" />
    <property name="lib.dir" value="lib" />
    <property name="lib.jars" value="commons-beanutils-1.8.0.jar commons-cli-1.2.jar commons-collections-2.1.1.jar commons-configuration-1.9.jar commons-digester-2.1.jar commons-lang-2.6.jar commons-logging-1.1.1.jar groovy-all-2.0.1.jar jasperreports-4.8.0.jar jcommon-1.0.15.jar jfreechart-1.0.12.jar log4j-1.2.17.jar postgresql-9.2-1002.jdbc3.jar" />
    <property name="config.dir" value="config"/>
    <property name="build.dir" value="build" />
    <property name="classes.dir" value="${build.dir}/classes" />
    <property name="dest.dir" value="${build.dir}/release" />
    <property name="dest.jar" value="${dest.dir}/stocktotal-report.jar" />

    <path id="classpath">
        <fileset dir="${lib.dir}" >
            <include name="**/*.jar" /> 
        </fileset>
    </path>

    <target name="clean">
        <delete dir="${build.dir}" />
    </target>

    <target name="compile" depends="clean">
        <mkdir dir="${classes.dir}" />

        <javac srcdir="${src.dir}" encoding="UTF-8" destdir="${classes.dir}" includeantruntime="false" debug="true">
            <classpath refid="classpath" />
            <include name="**/*.java" />
        </javac>
        
        <!-- Copy all config files to ${classes.dir} -->
        <copy todir="${classes.dir}">
            <fileset dir="${src.dir}">
                <exclude name="**/*.java" />
            </fileset>
        </copy>
    </target>
    
    <target name="jar" depends="compile">
        <jar destfile="${dest.jar}">
            <fileset dir="${classes.dir}" />
            <manifest>
                <attribute name="Main-Class" value="stocktotal.report.Program"/>
                <attribute name="Class-Path" value="${lib.jars}"/>
            </manifest>
        </jar>
        <copy todir="${dest.dir}">
            <fileset dir="${lib.dir}" />
        </copy>
           <copy todir="${dest.dir}">
            <fileset dir="${config.dir}" />
        </copy>        
    </target>

    <target name="run">
        <java jar="${dest.jar}" fork="true" failonerror="true" />
    </target>

</project>

準備妥當後,只要在 command prompt 下 build 就可以了:ant -f build.xml

執行程式,java -jar stocktotal-report.jar -stockcode 2330 -configfile ReportGenerator.config


剛開始使用 Apache Ant 一定很不習慣,但久了就熟悉了。不管電腦環境怎麼改變,command line 才是良好的自動化界面,這不禁讓我想到實假登錄網站,那就不是好的自動化界面。

沒有留言:

張貼留言