Deploy Cimande pada Weblogic 10.3
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 installuntuk 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.
Menginstall Maven 3 pada Ubuntu
Sekedar mengembalikan postingan yang sempat hilang ditelan bumi :D
Posted on August 03, 2011 by Dian Aditya
Hari ini saya telah berhasil mengupgrade versi Maven pada ubuntu 10.04 saya dari versi 2.x ke versi 3.x. Berbeda dengan versi sebelumnya, Maven 3 tidak tersedia pada paket update Ubuntu, sehingga cara instalasinya berbeda pula dengan Maven 2.
Ilustrasi
$sudo apt-get install maven3
Mungkin akan terasa nikmat jika perintah diatas berjalan dengan mulus :D
Ok, saya rasa semuanya sudah mengerti. Berikut proses instalasi Maven 3 pada Ubuntu secara manual. Sebelumnya pastikan java telah terinstal terlebih dahulu.
- Download paket Maven 3 di sini. Kemudian extract paket yang sudah didownload.
Pada kasus ini paket saya extract pada/opt - Tambahkan PATH variable pada environtment file.
- Rubah PATH, biasanya seperti ini
- Logout
$tar -xzvf apache-maven-3.0.3-bin.tar.gz
$sudo gedit /etc/environment
JAVA_HOME="/opt/jdk1.6.0_21"
M3_HOME="/opt/apache-maven-3.0.3"
MAVEN_HOME="/opt/apache-maven-3.0.3"
M3="/opt/apache-maven-3.0.3/bin"
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
Menjadi seperti berikut
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/apache-maven-3.0.3/bin"
Setelah proses diata selesai, login kembali, kemudian lakukan cek versi maven.
$mvn -version
jika berhasil seharusnya konsol mengembalikan hasil seperti berikut
Apache Maven 3.0.3 (r1075438; 2011-03-01 00:31:09+0700)
Maven home: /opt/apache-maven-3.0.3
Java version: 1.6.0_21, vendor: Sun Microsystems Inc.
Java home: /opt/jdk1.6.0_21/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-33-generic", arch: "i386", family: "unix"
Cimande 2.0-RC2 Release
Hampir tidak terasa sudah satu tahun sejak rencana major release BlueOxygen Workspace (Cimande) versi 2.0 dicetuskan dengan mengusung konsep Representational State Transfer (ReST). Diawali dengan lahirnya versi Release Candidate 1 (RC1) akhir tahun lalu, yang juga merupakan awal dari dimulainya mobilisasi terhadap beberapa produk BlueOxygen yang secara keseluruhan berjalan diatas platform Cimande. Dengan dukungan multiple representational yang masih dan terus disempurnakan hingga saat ini diharapkan dalam major release mendatang Blueoxygen Workspace benar-benar menjadi platform yang ramah akan perangkat mobile, baik itu mobile web maupun native (Android, iPhone, Blackberry, dll).

Prototype Cimande versi tablet dengan jQuery Mobile SplitView
Berbeda dengan versi sebelumnya, banyak hal spesial yang terjadi dalam pengembangan RC2 ini yang membuat waktu release sempat mundur dari jadwal yang sudah direncanakan. Sedikit bocoran, banyak diantaranya yang belum dituliskan pada roadmap dan tiba-tiba ada pada RC2 ini. Secara teknis, berikut beberapa perubahan dan fitur terbaru yang telah ditambahkan :
Full ajax support
Dengan dukungan ajax secara penuh, semua proses request dan response telah ditangani pada background sehingga membuat aplikasi berjalan lebih cepat. Modul-modul yang berjalan diatas Cimande Platform juga secara otomatis akan terintegrasi dengan fitur ajax ini sehingga aplikasi yang sudah berjalan sebelumnya tidak perlu ditulis ulang untuk menyesuaikan dengan versi Cimande ini. Penggunaan http method diluar POST dan GET dalam tag <form> seperti PUT, HEAD, DELETE juga dimunggkinkan dengan ketentuan browser mendukung XMLHttpRequest.
Layout dan tema baru
Setelah hampir satu dekade setia dengan tema lama, dalam rangkaian major release ini Cimande v2 telah berganti kulit dengan tema berlatar biru tua, warna khas BlueOxygen, serta dengan logo Blueoxygen terbaru.



Maven Build Tool & Archetype
Yang paling menarik dari versi 2 ini adalah perubahan build tool yang selama ini menggunakan Ant menjadi Maven dengan plugin dan dependency managementnya yang sangat powerfull. Hal ini sedikit banyak juga telah membuang kesan Cimande yang kurang akur dengan IDE selain Eclipse. Sehingga developer yang akan mengembangkan aplikasi dia atas Platform Cimande dapat memilih menggunakan IDE sesuai dengan selera yang dikehendaki. Saat ini Cimande telah di-host di java.net, dengan Nexus yang telah termirror dengan Maven Central membuat para pengembang cukup menggenerate archetype untuk membuat sebuah workspace yang siap pakai. Langkah untuk melakukan generate archetype berada pada artikel berikut.
Hingga saat ini tim pengembang masih terus melakukan optimasi untuk relesase berikutnya.
Hal yang tak pernah lupa untuk disebutkan, BlueOxygen Cimande merupakan produk OpenSource dibawah Lisensi Apache. Seluruh source code berada pada cimande.java.net.
Spring Classpath Resource, beda Middleware beda Konfigurasi (Tomcat vs Glassfish)
Dua hari pusing mikirin session factory dari hibernate.cfg.xml yang gak kebaca di konfigurasi spring. Yap, baru-baru ini saya lagi sibuk jalanin cimande v2 di glassfish (yang alhamdulillah baru jalan lancar setelah dua hari). Ya memang kedengarannya payah, tapi mungkin bisa jadi ada juga yang memiliki nasib mirip seperti saya. Berawal dari kisah buruk itulah dengan hati tulus ikhlas saya berusaha agar teman-teman yang lain tidak mengalami kejadian yang mirip seperti yang saya alami tersebut.
Jadi begini awal mula ceritanya, dari mulai kenal cimande sampai saya gede seperti ini belum pernah sekalipun saya coba jalanin ini aplikasi di container selain tomcat (sekarang sudah :D). Kemudian suatu hari muncullah titah dari Pak Bos untuk menjalankan cimande yang terdiri dari komposisi Struts2 + Spring + Hibernate di app server yang bernama Glassfish. 1, 2, 3, beberapa saat lancar-lancar aja (sampai muncul halaman login :P) dan akhirnya hal itupun terjadi. Masalah sederhana, gak mau login. Usut punya usut ternyata database tidak mengembalikan nilai yang diminta oleh client, usut punya usut lagi ternyata hibernate session factory yang diinject oleh spring bernilai kosong alias hibernate.cfg seakan tidak pernah dilahirkan. Anehnya di tomcat lancar-lancar saja, ya saya sadar kalo masalah beginian pasti saya yang salah.
Berikut konfigurasi saya sebelumnya
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" p:dataSource-ref="dataSource" p:hibernateProperties="classpath:hibernate.properties"> <property name="eventListeners"> <map> <entry key="merge"> <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" /> </entry> </map> </property> <property name="configLocations"> <list> <value>classpath:hibernate*.xml</value> </list> </property> </bean>
Yes, setelah bertapa beberapa hari akhirnya ketemulah biang errornya (coba tebak yang mana :P)
Dan berikut ini konfigurasi setelah saya rubah.
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" p:dataSource-ref="dataSource" p:hibernateProperties="/WEB-INF/classes/hibernate.properties"> <property name="eventListeners"> <map> <entry key="merge"> <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" /> </entry> </map> </property> <property name="configLocations"> <list> <value>/WEB-INF/classes/hibernate*.xml</value> </list> </property> </bean>
Setelah ditelusuri ternyata ketika dijalankan pada glassfish spring tidak mengenali classpathnya di sebelah mana, sehingga harus merujuk langsung ke tempat dimana semua file dicompile yaitu pada /WEB-INF/classes, dan walhasil cimande saya berhasil jalan di glassfish. Nah pertanyaan selanjutnya bagaimana jika saya menaruh file konfigurasinya di dalam jar file? Bagi yang bisa bantu ditunggu komennya di bawah tulisan ini. Semoga bermanfaat...
