Senin, 10 Oktober 2011

Pengenalan Ant Bagian 2

Hai hai semuaa.. siap dengan hari yang menantang lagi? Kalo pak Mario Teguh punya"Salam Super" maka mari kita buat salam sendiri,, "Salam Petualang"^_^
Oke setelah pada posting terdahulu kita belajar menggunakan Ant, sekarang kita lanjut dengan materi yang agak sedikit lebih rumit lagi. Pada posting terdahulu kita hanya memiliki satu sumber kode java yang menampilkan pesan yang kita tulis pada console, tanpa adanya dependency dengan library lain. Sekarang kita akan menambahkan suatu baris kode sehingga memiliki dependency, dan kita akan menyertakan library tersebut pada paket distribusinya agar terlihat lebih rumit ;-p
Untuk itu kita perlu menambahkan fitur pada program terdahulu, diantaranya :
  1. Fitur logging.
  2. Fitur Unit Test.

Pertama agar kita punya dependensi dengan library lain kita tambahkan fitur logging, kita akan memakai log4j dari apache, kemudian agar project kita memiliki efisiensi kita gunakan library spiffy framework, penjelasan mengenai library2 tersebut bisa dibaca di website-nya. Kita perlu menambah direktory untuk menempatkan library dan kode test, tambahkan direktory test, lib, dan reports. Tambahkan file library yang dibutuhkan, kemudian buat code untuk melakukan testing yaitu MainTest.java direktory test, jangan lupa buat file pengaturan logging (log4j.properties) di folder source, sehingga didapat susunan di bawah ini :
+Latihan
|  | 
|--+src
|    |
|    log4j.properties
|    |
|    +com
|      |
|      +dicky
|         | 
|         Main.java
|  
|--+lib
|    |
|    +source
|    |  |
|    |  log4j-1.2.16.jar
|    |  |
|    |  spiffy-all-0.05.jar
|    |
|    +test
|       |
|       junit-4.5.jar
|
|--+test
|    |
|    +com
|      |
|      +dicky
|         | 
|         MainTest.java 
|
|--+reports
|
|--build.xml
kemudian setelah struktur project siap, kita perlu mengubah code dari Main java menjadi seperti ini :
package com.dicky;

import org.apache.log4j.Logger;
import spiffy.log4j.LoggerHelper;

public class Main {

 private static final Logger logger = LoggerHelper.getLogger();

 public int triple(int x) {
  logger.info("Menghitung nilai pangkat 3 dari " + x);
  return x*x*x; 
 }

 public static void main(String[] args) {
  Main main = new Main();
  System.out.println("Pangkat 3 dari 6 adalah = " + main.triple(6));
 }
}
Edit file log4j.properties di folder src yang contoh isinya seperti ini, berguna sebagai pengaturan loggingnya :
log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
Setelah semua siap kita perlu "mengaitkan" source code dengan library-library tersebut, untuk itu kita perlu mengubah file build.xml seperti ini :
<project name="PengenalanAnt" default="jar" basedir=".">
 <description>
  Latihan nyoba build dengan ant.
 </description>
 
 <!-- Mendeklarasikan nama-nama property yang akan dipakai -->
 <property name="app.name" value="pengenalanant" />
 <property name="src.dir" location="src" />
 <property name="src.test.dir" location="test" />
 <property name="lib.dir" location="lib" />
 <property name="lib.source.dir" value="&{lib.dir}/source" />
 <property name="lib.test.dir" value="&{lib.dir}/test" />
 <property name="build.dir" location="build" />
 <property name="classes.dir" location="&{build.dir}/classes" />
 <property name="classes.test.dir" location="&{build.dir}/test" />
 <property name="target.dir" location="dist" />
 <property name="target.lib.dir" location="dist/lib" />
 <property name="report.dir" value="reports" />
 <property name="test.report.dir" value="&{report.dir}/tests" />
 <property name="test.pattern" value="**/**Test.java" />
 
 <!-- setting kompilasi -->
 <property name="compile.debug" value="true" />
 <property name="compile.deprecation" value="true" />
 <property name="comiple.optimize" value="true" />

 <!-- paths untuk dependensi source code java -->
 <path id="build.classpath">
  <fileset dir="&{lib.source.dir}">
   <include name="**/*.jar" />   
  </fileset>
 </path>
 
 <!-- paths untuk dependensi source code test java -->
 <path id="build.test.classpath">
  <fileset dir="&{lib.test.dir}">
   <include name="**/*.jar" />   
  </fileset>
 </path>
 
 <!-- 
  hilangkan hierarky folder sumber, semua disimpan dalam folder lib
  ini digunakan sebagai distribusi, sebagai library dari pengenalanant.jar
 -->
 <pathconvert property="manifest.classpath" pathsep=" ">
  <path refid="build.classpath"/>
  <mapper>
   <chainedmapper>
    <flattenmapper/>
    <globmapper from="*.jar" to="lib/*.jar"/>
   </chainedmapper>
  </mapper>
 </pathconvert>
 
 <target name="clean" description="menghapus direktory hasil kompilasi" >
  <delete dir="&{target.lib.dir}"/>
  <delete dir="&{target.dir}"/>
  <delete dir="&{classes.dir}"/>
  <delete dir="&{classes.test.dir}"/>
  <delete dir="&{build.dir}"/>
  <delete dir="&{test.report.dir}"/>
 </target>
 
 <target name="-init">
  <mkdir dir="&{build.dir}" />
  <mkdir dir="&{classes.dir}" />
  <mkdir dir="&{classes.test.dir}" />
  <mkdir dir="&{target.dir}" />
  <mkdir dir="&{target.lib.dir}"/>
  <mkdir dir="&{test.report.dir}"/>
 </target>
 
 <target name="build" depends="-init" description="Mengkompilasi source code " >  
  <javac debug="&{compile.debug}" deprecation="&{compile.deprecation}" optimize="&{comiple.optimize}" srcdir="&{src.dir}" destdir="&{classes.dir}">
   <classpath>
    <path refid="build.classpath" />
   </classpath>
  </javac>
  <copy todir="&{classes.dir}" filtering="off">
   <flattenmapper />
   <fileset dir="&{src.dir}">
    <include name="*.*"/>
   </fileset>
  </copy>
 </target>
 
 <target name="build-test" depends="build" description="Mengkompilasi source code test" >  
  <javac debug="&{compile.debug}" deprecation="&{compile.deprecation}" optimize="&{comiple.optimize}" srcdir="&{src.test.dir}" destdir="&{classes.test.dir}">
   <classpath>
    <path refid="build.test.classpath" />
    <path refid="build.classpath" />
    <pathelement path="&{classes.dir}" />
   </classpath>
  </javac>
  <copy todir="&{classes.test.dir}" filtering="off">
   <flattenmapper />
   <fileset dir="&{src.test.dir}">
    <include name="*.*"/>
   </fileset>
  </copy>
 </target>
 
 <target name="clean-build" depends="clean, build" description="kompilasi dengan menghapus file" /> 
 
 <target name="test" depends="build-test" description="jalankan semua test (unit)">
  <junit dir="&{basedir}" printsummary="on" fork="true" haltonfailure="false" errorProperty="test.failed" failureProperty="test.failed">
   <sysproperty key="basedir" value="&{basedir}" />
   <formatter type="xml" />
   <classpath>
    <path refid="build.test.classpath" />
    <path refid="build.classpath" />
    <pathelement path="&{classes.dir}" />
    <pathelement path="&{classes.test.dir}" />
   </classpath>
   <batchtest todir="&{test.report.dir}">
    <fileset dir="&{src.test.dir}">
     <include name="&{test.pattern}" />
    </fileset>
   </batchtest>
  </junit>
 </target>
 
 <target name="jar" depends="build" description="Menggabungkan distribusi" >
  <delete file="&{target.dir}/&{app.name}.jar" />
  <jar jarfile="&{target.dir}/&{app.name}.jar" basedir="&{classes.dir}">
   <manifest>
    <attribute name="Main-Class" value="com.dicky.Main"/>
    <attribute name="Class-Path" value="&{manifest.classpath}"/>
   </manifest>
  </jar>
  <copy todir="&{target.lib.dir}" filtering="off">
   <flattenmapper />
   <fileset dir="&{lib.dir}">
    <include name="**/*.jar"/>
   </fileset>
  </copy>
 </target>
</project>
jalankan test dengan perintah :
ant test
bisa dilihat hasil test di folder reports, cobalah dengan mengubah nilainya sehingga didapat test yang gagal!
Demikian lanjutan dari Pengenalan Ant, jika masih bingung bisa mendownload source code yang telah saya upload di google code. Selamat belajar!