這裡我說明怎麼從 Eclipse build process 移植到 Apache Ant build process。
StocktotalReport 目錄結構:
build.xmlconfig/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 大致包括幾個流程:
- Clean building environment
- Compile Java source code to Java classes
- 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 才是良好的自動化界面,這不禁讓我想到實假登錄網站,那就不是好的自動化界面。
沒有留言:
張貼留言