Monday, December 14, 2015

Aplikasi OSGi berbasis Web

Pada saat aplikasi OSGi di deploy sebagai OSGI bundle, di dalam dunia OSGi aplikasi ini disebut Web Application Bundle (WAB), tidak jauh berbeda dengan WAR yg sudah biasa kita gunakan.

Aplikasi WAB dapat berjalan didalam 2 context yaitu OSGi bundle context dan JavaEE context. Di dalam OSGi bundle context aplikasi WAB dapat menikmati semua capabilities yg di provide oleh OSGi spec (runtime module loading, etc), dan di dalam JavaEE context aplikasi WAB dapat menggunakan service-service yg di provide oleh JavaEE spec, seperti JTA.

Untuk tujuan ini, diperlukan server yg sudah men-support OSGi Web Container. Kita dapat menggunakan Glassfish 4 disini dan maven sebagai build tool.

Generate java project menggunakan maven:

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.nostratech.hello.wab -DartifactId=hello-wab

Tambahkan dependency berikut di pom.xml:
<dependency>
    <groupId>org.osgi</groupId>
    <artifactId>org.osgi.core</artifactId>
    <version>5.0.0</version>
</dependency>
<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
</dependency>


Ganti packaging menjadi war:
<packaging>war</packaging>

Buat class yg meng-implement BundleActivator.Saya menggunakan class App yg di generate oleh maven.


Kita tidak melakukan apa-apa disini selain meng-output message untuk mengetahui aplikasi WAB sudah berjalan.

Lalu mari buat sebuah servlet utk selanjutnya dapat membuktikan bahwa aplikasi OSGi dapat berjalan sebagai aplikasi Web


Untuk mengbungkus aplikasi menjadi WAB, kita dapat menggunakan maven plugin dari apache felix, maven-bundle-plugin.

Web-ContextPath: ini yg menginstruksikan OSGi Web Container bahwa utk mendeploy aplikasi kita sebagai WAB
Bundle-Activator: akan dipanggil oleh OSGi runtime saat menjalankan aplikasi

Kita juga menggunakan maven-war-plugin untuk menambahkan file manifest yg telah di generate oleh plugin maven-bundle-plugin ke dalam war.

Berikut contoh file META-INF/MANIFEST.MF:

Manifest-Version: 1.0
Bundle-SymbolicName: com.nostratech.hello.wab.hello-wab
Archiver-Version: Plexus Archiver
Built-By: fani
Bnd-LastModified: 1450084631320
Bundle-ManifestVersion: 2
Import-Package: javax.servlet,javax.servlet.annotation,javax.servlet.h ttp,org.osgi.framework;version="[1.3,2)"
Tool: Bnd-2.1.0.20130426-122213
Bundle-Name: hello-wabBundle-Version: 1.0.0.SNAPSHOT
Bundle-ClassPath: WEB-INF/classes/
Bundle-Activator: com.nostratech.hello.wab.App
Web-ContextPath: /wab
Created-By: Apache Maven Bundle Plugin
Build-Jdk: 1.8.0_45

Jalankan perintah mvn clean package -DskipTests untuk membuat file war.


Sekarang kita siap men-deploy aplikasi WAB ke glassfish.
Jalankan glassfish dengan perintah asadmin start-domain domain1



Jika anda mendapatkan error seperti diatas, coba turunkan versi dependency org.osgi.core pada pom.xml

<artifactId>org.osgi.core</artifactId>
<version>4.0.0</version>

Ini terjadi karena versi org.osgi.framework yg dibutuhkan oleh aplikasi tidak terdapat pada server glassfish yg anda gunakan.

$ asadmin deploy --type=osgi target/hello-wab-1.0-SNAPSHOT.war



Bersambung ke part 2, dimana saya akan menjelaskan cara menggunakan module OSGi dari servlet.