Dian's Blog

{ while (true) { doLearning(); } }

Loading...

Kekuatan dibalik Proxy dalam Java

Posted on 15 April 2012 by Dian Aditya

Proxy sudah diperkenalkan sejak java 1.3, salah satu kekuatan (yang tidak tersembunyi) dari java yang sangat berguna dalam pembuatan aplikasi dengan tingkat modularitas tinggi.

Sebelumnya kita ambil contoh dalam kehidupan coding sehari-hari, dengan atau tanpa disadari proxy ada dimana-mana seperti Spring yang mengimplementasikannya untuk AOP, Hibernate untuk lazy loading-nya, dan Google Guice dalam hal dependency Injection.

Dalam Java, dynamic proxy adalah sebuah intance pengganti dari object sesungguhnya. Dengan proxy, pemanggilan sebuah method (method invocation) dapat dicegat (intercepted) sehingga kita dapat memasukkan cutom code sebelum ataupun setelah pemaggilan method. Sangat powerful bukan?

Dalam penggunaannya, diluar dynamic proxy standart yang disediakan oleh JDK, banyak library yang menyediakan fitur proxy dalam penggunaannya, sebagai contoh Spring menyediakan JDK dynamic proxy dan CGLIB proxy bagi user untuk memilih salah satu. Begitu pula Hibernate yang menggunakan CGLIB untuk versi 3.x ke bawah yang kemudian berpindah menggunakan secara penuh Javassisst untuk menangani urusan proxy.

Ada beberapa perbedaan antara JDK dynamic proxy dengan CGLIB serta Javassist, akan saya jelaskan sebagai berikut

JDK Dynamic Proxy

  • Proxy dibangun berdasarkan pada runtime interface, dengan kata lain proxy harus memiliki interface untuk dapat diciptakan.
  • Karena proxy dipaksa untuk menjadi implementasi dari sudatu interface maka sudah dipastikan kita tidak bisa melakukan casting terhadap class lain.
  • Object menjadi turunan dari java.lang.reflect.Proxy

Berikut contoh kode sedehananya, sebuah proxy yang akan menghalau setiap method bernama call dengan mengembalikan nilai null apapun nilainya.

class DisableEveryCall implements InvocationHandler {
	private Object object;

	public DisableEveryCall(Object object) {
		this.object = object;
	}

	public Object invoke(Object proxy, Method method, Object[] args)
		throws Throwable {

		if (method.getName().equalsIgnoreCase("call")) {
			return null;
		}

		return method.invoke(object, args);
	}
}

Method invoke akan meng-intercept setiap method, dalam kasus ini hanya method dengan nama call yang akan mereturn null dengan apapun kondisinya. Kemudian berikut cara membuat proxy-nya.

Callable callable = new Callable() {
	public String call() throws Exception {
		return "Called!";
	}
};

Proxy proxy = (Proxy) Proxy.newProxyInstance(
	Callable.class.getClassLoader(),
	new Class[] { Callable.class }, new DisableEveryCall(callable));

callable = (Callable) proxy;
System.out.println(callable.call());

CGLIB Proxy

  • Tidak mengharuskan interface.
  • Proxy dibangun dengan cara mensub-classkan terhadap class sesungguhnya. Hal ini mengindikasikan bahwa class apapun yang digunakan dapat dimungkinkan untuk dijadikan proxy.
  • CGLIB proxy bersifat final. Maka adalah sebuah hal sia-sia untuk memproxy sebuah proxy karena tidak akan berhasil.

Mari membuat contoh yang agak berbeda, ketika kita memanggil method toString proxy akan mengembalikan dengan nilai null bagaimanapun caranya user melakukan override terhadap method tersebut.

	
class DisableToString implements MethodInterceptor {
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {

		return "toString".equals(method.getName()) ? null : proxy
			.invokeSuper(obj, args);
	}
}

Pembuatan proxy dapat dilakukan dengan cara berikut

	
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Object.class);
enhancer.setCallback(new DisableToString());

Object proxy = enhancer.create();
System.out.println(proxy.toString());

Javassist Proxy

Tidak banyak perbedaan antara Javassist dengan CGLIB proxy, penjelasan tersebut dapat langsung saya ambil dari dokumentasi source-nya.

Package javassist.util.proxy

Dynamic proxy (similar to Enhancer of cglib).

Perbedaan paling utama adalah kita tidak dapat menambahkan sebuah method baru kedalam Javassist proxy, sedangkan hal tersebut dimungkinkan pada CGLIB proxy. Serta fitur utama dari Javassist sendiri adalah bytecode manipulation library yang lebih mengedepankan manipulasi class pada saat compile-time bahkan mendefinisikan class baru pada saat run-time daripada memproxynya, sangat powerful dalam sisi lain tapi tidak dengan fitur proxy-nya. Berikut beberapa hal dalam Javassist proxy:

  • Lebih lambat dari CGLIB proxy maupun JDK proxy (untuk saat ini)

Agar mudah saya akan membuat contoh dengan pendekatan yang tidak jauh berbeda.

class DisableToString implements MethodHandler {
	public Object invoke(Object self, Method thisMethod,
			Method proceed, Object[] args) throws Throwable {
		return null;
	}
}

Langkah pembuatan proxy-nya pun hampir sama

ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(Object.class);
factory.setFilter(new MethodFilter() {
	public boolean isHandled(Method m) {
		return "toString".equals(m.getName());
	}
});

Proxy proxy = (javassist.util.proxy.Proxy) factory
		.createClass().newInstance();
proxy.setHandler(new DisableToString());
		
Object object = proxy;
System.out.println(object.toString());

Kesimpulan

Java memiliki banyak fitur menarik, salah satunya adalah dynamic proxy. Spring transaction manager dan Hibernate lazy loading mungkin adalah contoh yang paling mudah untuk memahami bagaimana proxy bekerja untuk meng-intercept sebuah method. Banyak pula library pembantu di luar sana yang menyediakan fitur proxy dengan berbagai keunggulan masing-masing.

Enjoy.

Geliat Cloud 2012, Tahunnya PaaS?

Posted on 11 February 2012 by Dian Aditya

Bicara soal 2012 kembali kita dihadapkan pada topik paling hot di dunia, pasti gak akan jauh-jauh dari isu akhir dari peradaban manusia. Yah, mungkin saya akan berkata hal serupa juga andaikan saat ini saya adalah pengguna smarphone nokia, hehehe... Lupakan.

Kembali kita tarik mundur ke tahun lalu, tahun 2011 yang menurut saya jaman dimana meledaknya barang bernama Cloud. Sebuah infrastruktur/perangkat/informasi/servis/awan/-kabut/petir atau apalah namanya yang sulit dimengerti... Menjadi alasan yang saya anggap cukup kuat, kita tahu dengan populernya facebook, twitter, google, amazon youtube, dan masih banyak lagi web yang memposisikan dirinya sebagai Software as a Service (SaaS), yang secara tidak sadar telah membawa kita ke jaman sentralisasi data. Walauppun sulit untuk dijelaskan, kita dapat dengan mudah menyebut bahwa web-web tersebut adalah cloud.

Lanjut ke topik utama bahasan, PaaS, ya Platform as a Service, nama dan istilahnya masih nyambung-nyambung dengan SaaS, dan tahun 2012 sepertinya adalah tahunnya PaaS. Mengapa begitu, indikasi paling nyata adalah dengan mulai menjamurnya penyedia layanan cloud seperti Amazon dengan EC2, Google dengan Google App Engine (GAE) dan google eclipse plugin-nya, RedHat dengan Openshift, VMWare dengan Cloudfoundry yang didukung dengan Springsource Tool Suite untuk mempermudah development dan proses deploy, tidak ketinggalan ada Jelastic yang dapat melakukan checkout source code dan secara otomatis mengcompile diudara, dan masih banyak lagi. Dan kabar baiknya sebagian besar yang saya sebutkan diatas rata-rata masih bersifat gratis, maka nikmatilah sebelum masa itu berakhir (yang pasti akan terjadi).

Tidak dapat dipungkiri bahwa ini adalah trend, dan developer telah dihadapkan ke posisi yang lebih menyenangkan, menjauh dari model tradisional. Para pengembang aplikasi dapat lebih terfokus terhadap fungsionalitas dan dan kualitas aplikasi ketimbang memikirkan masalah struktur dibawahnya. Begitupun dengan penyedia layanan juga mendapatkan keuntungan dengan berfokus pada penyediaan dan pengelolaan terhadap suberdaya dan infrastrukturnya, kemudian menyediakannya sebagai produk PaaS yang diinginkan oleh user. Sama-sama untung bukan?


Dunia cloud semakin membesar, dan 2012 adalah tahunnya, yang membawa developer terbang jauh ke awan, pilihan kita hanya ikut serta, mendahului, atau tertinggal. Dengan dunia IT yang kecepatan lajunya sudah sangat kencang, mau kemana?

Yang Sering Dilakukan Siswa dan yang Sering Diabaikan oleh Pembimbing dalam Tugas Akhir

Posted on 16 January 2012 by Dian Aditya

Akhir Desember lalu saya berkesempatan untuk menjadi penguji eksternal (dari pihak industri) mewakili Meruvian di salah satu SMK swasta top di Kota Malang. Sangat istimewa karena kampung halaman saya berada di Kota Batu yang berdempetan dengan Malang, berasa seperti tiket mudik gratis dimana malamnya saya bisa ketemu teman-teman lama sambil ngopi bareng di pinggiran Jl. Diponegoro, bertemu hawa dingin dan pemandangan gunung di kiri kanan yang asri. #eaaa berasa makin lebay dan gak nyambung dengan judul.

Yap, setelah 2 hari mejeng di depan para siswa sebagai killer, disisi lain banyak diskusi menarik dengan para guru di setiap jeda dan seusai ujian mengenai kompetensi para siswa didiknya. Banyak point yang akhirnya disinggung, terutama masalah standart penyajian aplikasi seperti presentasi, pembuatan flow, DFD, ERD, laporan harcopy yang segepok dan banyak lagi hal-hal yang berbau teoritis yang menariknya belum pernah diajarkan sebelumnya kepada siswa, atau boleh juga dieja 'sudah diajarkan tapi sedikit', dimana point-point tersebut ada dalam lembar penilaian. Berbau menghakimi memang, yah tapi itu kenyataannya, dan saya yakin hal ini terjadi hampir di seluruh SMK (opini subjektif).

Maka dari itu sebagai rekanan industri yang baik #ceile disini saya akan membeberkan beberapa hal yang sering dilakukan siswa dalam tugas akhir yang menjadi point penilaian penguji yang sering luput dari bagian pengarahan pembimbing. Semoga dapat menjadi referensi untuk siswa SMK yang akan menghadapi tugas akhir agar tidak melakukan hal-hal di berikut.

Presentasi

Software: Siswa selalu update, jaman semakin berkembang, tidak salah kalau presentasi harus pakai barang canggih. Maka dipakailah software yang bernama MS Office dengan versi keluaran minimal tahun 2007 (yang kita semua tahu sebagian bersar pasti bajakan).

Estetika: Banyak gambar-gambar bertebaran di slide yang akhirnya berkesan kurang profesional. Ada yang full manga, ada yang suka warna biru sampai semua tulisan dikasih biru dengan backgroundnya laut (mana kelihatan), yang ngefans ayu tingting juga gak mau kalah gitu juga, gak lah.

ERD: Sebagian besar menggunakan entity-relationship model

sebagian kecil lainnya menggunakan object-relational model

Saya juga baru tahu kalau ERD ada macam-macam modelnya :) tetapi object-relational model yang paling lazim digunakan dalam pembuatan aplikasi, ini yang bikin heran kenapa sebagian besar pakai entity-relational model.

Detail teknologi: hampir semua hanya menulis, "Java Web + MySql", "PHP", atau "Java Web + XAMPP" (gak paham yang ini), tanpa dijelaskan secara detail pustaka apa saja yang digunakan, padahal untuk java pasti buanyak pustaka yang dicomot.

Pembatasan Kasus

Ini yang paling suka saya bahas, pengalaman saya juga sebagai siswa biasanya minim ide. Banyak ide yang dibuat seolah berbeda padahal isinya sama, seperti Aplikasi Toko, ada yang membuat Toko Bola online, Toko Musik onlie, dan toko-toko yang lainnya. Disinilah 'seharusnya' peran pembimbing untuk mengarahkan siswa dalam hal kreatifitas yang sering luput.

Ketuntasan aplikasi: ada cerita menarik ketika saya berhadapan dengan siswa yang membuat sebuah aplikasi pemesanan lapangan futsal online.

Siswa : (sambil mendemokan aplikasi) "Berikut ini adalah form pemesanan. User yang akan menyewa lapangan harus mengisi form disini."

Penguji : "Tidak ada register/login? Jadi orang tidak dikenal bisa langsung pesan?"

Siswa : "Mmmm, iya."

Penguji : "Oke silakan dilanjutkan."

Siswa : (Masuk halaman admin) "Kemudian orang yang pesan tadi datanya masuk ke halaman admin."

Penguji : "Kalau ada orang yang mau pesan di jam yang sama?"

Siswa : "Tidak bisa."

Penguji : "Untuk pembayarannya bagaimana?"

Siswa : "Ya... dibayar di tempat."

Penguji : "Kalau yang pesan tidak hadir di hari H?"

Siswa : (hening)

Penguji : "Kalau yang pesan gitu semua gimana hayo?"

Siswa : (hening)

Penguji : (pasang muka baik) "Kan seharusnya ada konfirmasi pembayaran, biar gak bangkrut usahanya."

Siswa : (meringis)

Penguji : "Jadi aplikasi kamu gak tuntas dong, mmm dikasih nilai berapa yah..."

Siswa : (mewek)

Sedikit percakapan diatas bisa menjadi sedikit gambaran bagaimana membuat aplikasi seharusnya tuntas, yah lagi-lagi peran pembimbing untuk melakukan check terhadap aplikasi siswa sebelum datang hari akhir (tugas akhir maksudnya).

Untuk sementara itu saja pengamatan saya tentang pelaksanaan tugas akhir kemarin, inti dari permasalahan yang saya angkat sebetulnya adalah kritikan untuk pembimbing sekolah yang terkadang (mohon maaf) kurang kejam untuk masalah lolos-meloloskan laporan akhir siswa, sehingga siswa seolah menjadi objek penyiksaan penguji eksternal, yang padahal memang sebetulnya aplikasinya belum layak untuk dijadikan tugas akhir. Tetapi terkadang malah diloloskan dengan alasan kasih sayang yang tanpa pandang bulu (opini subjektif). Masih banyak curahat yang belum sempat tersampaikan, mungkin lain kali bakal lebih panjang lagi bahasannya.

Semoga SMK makin maju. Salam "SMK Sakti Mandraguna, gak cuma bisa-bisaan..."


Criteria Query, Hibernate dan JPA 2.0 (JPA2 part 1)

Posted on 12 November 2011 by Dian Aditya

Salah satu tambahan terbesar dari spesifikasi JPA (Java Persistence API) versi 2.0 adalah criteria query. Dirilis pada Desember 2009, JPA 2.0 menyediakan API baru yang memungkinkan penggunaan criteria query, meskipun kita tahu pada framework ORM seperti Hibernate sudah terlebih dahulu menyediakan criteria query sejak versi 3.0. Hmm, bagaimanapun JPA adalah spesifikasi standard untuk Persistence yang mana dengan JPA kita bisa memilih JPA provider seperti Hibernate, EclipseLink, OpenJPA, DataNucleus, ataupun ObjectDB sesuka hati tanpa perlu mengganti banyak konfigurasi karena seluruh abstraksi ada di bawah package javax.persistence.*

Pada postingan kali ini saya akan mengulas tentang penggunaan Criteria Query pada JPA (dengan Hibernate sebagai persistence provider) dan Qriteria Query pada Hibernate (native).

Sedikit berbeda dengan JPA 1.0, walaupun diklaim sebagai vendor-independent, kita tidak akan menemukan javax.persistence:javax.persistence:2.0 pada Maven Central, melainkan kita harus mencarinya pada masing-masing ORM vendor. Sebagai contoh jika kita menggunakan hibernate maka artifact untuk JPA 2.0 adalah

<dependency>
	<groupId>org.hibernate.javax.persistence</groupId>
	<artifactId>hibernate-jpa-2.0-api</artifactId>
	<version>1.0.0.Final</version>
	<type>jar</type>
	<scope>compile</scope>
</dependency>

Oke marilah langsung saja kita menuju ke area perangnya, dimisalkan saya memiliki sebuah entity (karyawan).

@Entity
@Table(name = "pegawai")
public class Pegawai {
	private long id;
	private String nama;
	private String telepon;
	private String alamat;

	// getter dan setter
}

Selanjutnya mari membuat sebuah JPA Query untuk menangani sebuah pencarian berdasarkan nama atau alamat pegawai.

SELECT p FROM Pegawai WHERE p.nama LIKE :nama OR p.alamat LIKE :alamat

Criteria Query

Hibernate

Citeria query pada hibernate umunya cukup mudah, kita tinggal mendefinisikan class entity pada saat pembuatan criteria, kemudian memasukkan masing-masing ekspresi menggunakan class org.hibernate.Criterion.

public List<Pegawai> getKaryawanByCriteriaH(String nama, String alamat) {
	Session session = sessionFactory.getCurrentSession();

	Criteria criteria = session.createCriteria(Pegawai.class);
	criteria.add(Restrictions.like("nama", nama));
	criteria.add(Restrictions.like("alamat", alamat));

	return criteria.list();
}

JPA

public List<Pegawai> getKaryawanByCriteria(String nama, String alamat) {
	CriteriaBuilder builder = entityManager.getCriteriaBuilder();
	CriteriaQuery<Pegawai> query = builder.createQuery(Pegawai.class);

	Root<Pegawai> root = query.from(Pegawai.class);
	query.where(builder.like(root.<String> get("nama"), nama),
			builder.like(root.<String> get("alamat"), alamat));

	return entityManager.createQuery(query).getResultList();
}

Sekilas tidak jauh berbeda citeria query pada Hibernate dengan JPA, akan tetapi sedikit yang terlihat jelas spesifikasi JPA sedikit lebih kompleks (baca: njelimet) dibandingkan criteria query pada Hibernate.

JPA Metamodel

Criteria Query pada JPA berbasiskan metamodel dari class yang telah terdaftar pada Persistence Unit. JPA 2 mendefinisikan typesafe Criteria API baru yang mengizinkan criteria query dibangun secara rapi/kuat. Penggunaan meta model pada JPA dan beberapa metode otomasi pembuatannya akan saya bahas pada postingan selanjutnya.

Deploy Cimande pada Weblogic 10.3

Posted on 08 November 2011 by Dian Aditya

Baru hangat-hangat nih, berbarengan dengan Release Blueoxygen Cimande versi 2.0, ada request untuk menjalankannya pada Weblogic Middleware versi 10.3. Semula saya pikir gak akan jauh beda dengan server-server enterprise lain yang pernah saya coba seperti Glassfish (saja). Dengan bermodal pede (tempe kedele) saya coba jalankan dengan menggunakan Cargo Maven Plugin dengan menambahkan konfigurasi seperti ini:

<plugin>
    <groupId>org.codehaus.cargo</groupId>
    <artifactId>cargo-maven2-plugin</artifactId>
    <version>1.1.3</version>
    <configuration>
        <container>
            <containerId>weblogic103x</containerId>
            <home>/home/dian/Oracle/Middleware/wlserver_10.3/</home>
        </container>
        <cargo.protocol>http</cargo.protocol>
        <cargo.hostname>localhost</cargo.hostname>
        <cargo.servlet.port>7001</cargo.servlet.port>
        <cargo.weblogic.administrator.user>default</cargo.weblogic.administrator.user>
        <cargo.weblogic.administrator.password>guecakep</cargo.weblogic.administrator.password>
        <context>cimande</context>
    </configuration>
</plugin>

Dan benar ketika saya jalankan dengan perintah clean verify cargo:run, mantra yang tidak diharapkan muncul

  

Caused By: java.lang.ClassNotFoundException: org.apache.struts2.views.JspSupportServlet

   at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:297)

   at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:270)

   at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:64)

   at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

   at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

   at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:179)

   ...

Yap, class yang diinginkan tidak ditemukan, dan ajaibnya seluruh library yang dibutuhkan (termasuk struts2-core-2.x.jar dimana terdapat class (org.apache.struts2.views.JspSupportServlet) sudah ada di folder webapp library (WEB-INF/lib) di dalam WAR yang telah dicompile. Googling punya googling ada sedikit pencerahan, dimana seluruh library yang dibutuhkan oleh webapp harus diletakkan di root EAR project. Ya benar, agak aneh, ada pemaksaan untuk menjadikan project saya menjadi enterprise archive, walaupun didalamnya tidak ada EJB-nya. Sehingga untuk struktur maven-nya pun berubah menjadi seperti ini.

Ada satu parent project yang memiliki 2 module yaitu berupa webapp (dengan packaging WAR) dan ear (dengan packaging EAR).

Karena semua library akan diletakkan pada EAR maka untuk menghindari duplikasi file jar, maka ada sedikit perubahan scope cimande-core pada webapp dari compile menjadi provided, artinya library tidak akan ikut disertakan ketika webapp di package menjadi WAR.

<dependency>
    <groupId>org.blueoxygen.cimande</groupId>
    <artifactId>cimande-core</artifactId>
    <version>${cimande.sdk.version}</version>
    <scope>provided</scope>
</dependency>

Berikut isi dari konfigurasi pom.xml pada parent project

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.blueoxygen.cimande</groupId>
    <version>1.0</version>
    <artifactId>cimande-enterprise-parent</artifactId>
    <packaging>pom</packaging>
    <name>Cimande Enterprise Parent</name>
    <properties>
        <cimande.sdk.version>2.0</cimande.sdk.version>
    </properties>
    <modules>
        <module>ear</module>
        <module>webapp</module>
    </modules>
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-site-plugin</artifactId>
                    <configuration>
                        <unzipCommand>/usr/bin/unzip -o > err.txt</unzipCommand>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.blueoxygen.cimande</groupId>
            <artifactId>cimande-core</artifactId>
            <version>${cimande.sdk.version}</version>
        </dependency>
    </dependencies>
</project>

Dan Cargo Maven Plugin untuk menjalankan Weblogic saya letakkan pada pom.xml module ear, untuk mendeploy aplikasi dalam bentuk EAR.

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.blueoxygen.cimande</groupId>
    <artifactId>cimande-enterprise</artifactId>
    <packaging>ear</packaging>
    <version>1.0</version>
    <name>Cimande Enterprise</name>
    <parent>
        <groupId>org.blueoxygen.cimande</groupId>
        <artifactId>cimande-enterprise-parent</artifactId>
        <version>1.0</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.blueoxygen.cimande</groupId>
            <artifactId>cimande-webapp</artifactId>
            <version>1.0</version>
            <type>war</type>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-ear-plugin</artifactId>
                <configuration>
                    <generateApplicationXml>true</generateApplicationXml>
                    <defaultLibBundleDir>lib/</defaultLibBundleDir>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven2-plugin</artifactId>
                <version>1.1.3</version>
                <configuration>
                    <container>
                        <containerId>weblogic103x</containerId>
                        <home>/home/dian/Oracle/Middleware/wlserver_10.3/</home>
                    </container>
                    <cargo.protocol>http</cargo.protocol>
                    <cargo.hostname>localhost</cargo.hostname>
                    <cargo.servlet.port>7001</cargo.servlet.port>
                    <cargo.weblogic.administrator.user>default</cargo.weblogic.administrator.user>
                    <cargo.weblogic.administrator.password>tulalit13</cargo.weblogic.administrator.password>
                    <context>cimande</context>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <properties>
        <cimande.sdk.version>2.0</cimande.sdk.version>
    </properties>
</project>

Tak lupa yang terakhir (juga hasil googling) buat file weblogic-application.xml pada direktori {ear.home}/src/main/application/META-INF/, yang merupakan file deployment descriptor spesifik Weblogic server untuk application.xml dari Sun Microsystem. Dalam file ini konfigurasi yang dibutuhkan seperti shared library dideskripsikan.

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-application
    xmlns="http://www.bea.com/ns/weblogic/weblogic-application">
    <application-param>
        <param-name>webapp.encoding.default</param-name>
        <param-value>UTF-8</param-value>
    </application-param>
    <prefer-application-packages>
        <package-name>antlr.*</package-name>
        <package-name>javax.persistence.*</package-name>
        <package-name>org.apache.commons.*</package-name>
        <package-name>org.springframework.*</package-name>
        <package-name>org.hibernate.*</package-name>
    </prefer-application-packages>
</weblogic-application>

Dan akhirnya setelah semua mantra yang dituliskan diatas dijalankan satu per satu secara berurutan, maka tibalah saat-saat yang mendebarkan yaitu menjalankan aplikasi. Berikut langkah-langkah untuk menjalankannya.

  • masuk ke dalam direktori parent-project, kemudian masukkan perintah mvn clean install untuk menginstal ear dan webapp pada repository lokal.
  • masuk ke dalam direktori ear kemudian jalankan perintah mvn cargo:run
  • buka browser, pada contoh konfigurasi diatas Cimande dapat diakses melalui http://localhost:7001/cimande-webapp

Dan akhirnya dengan modal pede + googling saya berhasil menjalankan BlueOxygen Cimande pada Weblogic Server.

NB: mengingat konfigurasi diatas cukup rumit, tim developer saat ini sedang mempersiapkan Maven archetype untuk mempermudah user mengembangkan Cimande project diatas Weblogic dengan cukup menggenerate archetype yang akan segera tersedia di maven central.