Minggu, 16 Oktober 2011

Pengenalan Ant Bagian 3

Setelah kita belajar bagaimana menambahkan library dan fungsi unit testing pada posting pengenalan ant terdahulu, kini kita coba berlatih lagi, kali ini kita belajar membuat file war, jadi latihan kali ini kita akan belajar ant dengan membuat web yang akan diupload ke server (bisa tomcat, glassfish, dsb) sehingga bisa diakses user melalui browser.

Untuk struktur java web sedikit berbeda dengan java desktop, dengan memodifikasi project dari latihan terdahulu, buat struktur direktory project seperti di bawah ini :
+Latihan
|  | 
|--+web
|    |
|    index.jsp
|    |
|    +WEB-INF
|        |
|        web.xml
|
|--+src
|    |
|    +conf
|    |
|    +java
|      |
|      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
Ada beberapa perubahan dalam susunan file-file dan directory dibanding dengan project jar di post terdahulu. Pertama kita edit dulu file web.xml menjadi seperti berikut :
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>
Dapat dilihat di web.xml di atas, halaman awal yang akan ditampilkan pertama kali adalah file index.jsp, makan kita edit dulu file index.jsp sebagai berikut :
<%-- 
    Document   : index
    Created on : Aug 1, 2005, 12:10:12 AM
    Author     : Dicky
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="com.dicky.Main" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Halaman awal</title>
    </head>
    <body>
  <%
   Main main = new Main();
  %>
  <h1>Nilai pangkat 3 dari 5 adalah :<%=main.triple(5)%></h1>
  
    </body>
</html>
File index.jsp menampilkan fungsi yang ada dalam code Main.java, maka kita perlu mengubah file Main.java sebagai berikut :
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; 
 }
}
Setelah persiapan sudah selesai kita buat, konfigurasi ant, ubah file build.xml seperti berikut :
<project name="PengenalanAnt" default="war" basedir=".">
 <description>
  Latihan nyoba build .war dengan ant.
 </description> 
 
 <!-- Mendeklarasikan nama-nama property yang akan dipakai -->
 <property name="app.name" value="pengenalanant" />
 <property name="warfile.name" value="${app.name}.war" />
 <property name="web.dir" value="${basedir}/web" />
 <property name="src.dir" location="src" />
 <property name="src.test.dir" location="test" />
 <property name="webxml.file" value="${web.dir}/WEB-INF/web.xml" />
 <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="lib.compile.dir" value="${lib.dir}/compile" />
 <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="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="compile.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>
  
 <target name="clean" description="menghapus direktory hasil kompilasi" >
  <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="${test.report.dir}"/>
 </target>
 
 <target name="build" depends="-init" description="Mengkompilasi source code " >  
  <javac debug="${compile.debug}" deprecation="${compile.deprecation}" optimize="${compile.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="${compile.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="war" depends="build" description="Menggabungkan distribusi" >
  <delete file="${target.dir}/${warfile.name}" />
  <war destfile="${target.dir}/${warfile.name}" webxml="${webxml.file}">
   <fileset dir="${web.dir}">
    <include name="**/*.jsp" />    
   </fileset>
   <mappedresources>
    <restrict>
     <path refid="build.classpath"/>
     <type type="file"/>
    </restrict>
    <chainedmapper>
     <flattenmapper/>
     <globmapper from="*.jar" to="WEB-INF/lib/*.jar"/>
    </chainedmapper>
   </mappedresources>   
   <classes dir="${classes.dir}" />
   <zipfileset dir="${web.dir}/WEB-INF" prefix="WEB-INF/classes">
    <include name="*.properties" />
   </zipfileset>
  </war>
 </target> 
</project>
Sudah, silahkan dicoba! Untuk Unit Testing jalankan perintah dalam console :
ant test
Untuk mengkompilasi menjadi file war jalankan perintah :
ant war
Untuk melihat tampilan, file war ini perlu dideploy ke server agar bisa dilihat dari browser (Firefox atau Chrome browser), posting berikutnya kita akan belajar mendeploy file war ke server (bisa Tomcat, Glassfish, dsb). Jika masih kesulitan silahkan download source codenya.