26 Juni 2018
Mengenal Java 9 Platform Module System (JPMS)

Java 9 Platform Module System (JPMS) merupakan salah satu fitur baru dalam rilis Java 9 yang memperkenalkan konsep pemrograman java secara modular. Tutorial ini akan memberikan gambaran umum proses pemrograman java dengan menggunakan konsep modular dengan Java 9.

Module

Module diperkenalkan dalam JPMS sebagai metode dalam pengelompokan package yang menampung beragam class dan resource. JDK 9 sendiri telah membagi paket-paket API menjadi sejumlah modul yang dapat dilihat dengan menggunakan perintah

java --list-modules

Untuk membuat sebuah modul kita perlu menyediakan deskriptor untuk modul tersebut dalam bentuk kode java dengan nama module-info.java. Sebagai contoh kita membuat modul dengan nama latihan.modul

module latihan.modul { }

Semisal dalam modul tersebut kita membuat sebuah class java dengan nama ProgramUtama yang akan ditampung dalam package latihan.modul.satu, kita bisa tuliskan contoh kode program untuk ProgramUtama.java seperti berikut :

package latihan.modul.satu;

public class ProgramUtama {
  public static void main(String[] args) {
    System.out.println("Hello World");
  }
}

Untuk susunan direktori, compiler menentukan aturan bahwa source code untuk modul harus disimpan dalam folder yang memiliki nama yang sama dengan modul tersebut.

Sebagai contoh jika kita menampung semua source code dalam folder src maka susunan direktori dan source code adalah sebagai berikut :

src\
    latihan.modul\
        module-info.java
        ProgramUtama.java

Dari sini kita bisa lanjutkan ke proses kompilasi dengan menggunakan perintah :

rmdir /S /Q build
md build
javac ^
  -d build ^
  --module-source-path src ^
  src\latihan.modul\*.java

Perintah diatas mengerjakan proses kompilasi dan menempatkan hasilnya dalam folder build. Susunan direktori build setelah proses kompilasi adalah sebagai berikut :

cmd01

Menggunakan Module

Penggunaan paket atau class yang disediakan dalam API umum terjadi dalam pemrograman java. Cara yang biasa dilakukan adalah dengan menyebutkan klausa import diikuti dengan nama paket atau class yang akan digunakan

import javax.swing.JFrame;

Berikut contoh kode program yang menggunakan API Swing

package latihan.modul.dua;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class ProgramUtama extends JFrame {

  public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
      (new ProgramUtama()).setVisible(true)
    });
  }

  public ProgramUtama() {
    setTitle("Hello World");
    setSize(400, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
  }

}

Pada rilis java sebelumnya, kode seperti diatas seharusnya dapat di-compile tanpa ada pesan kesalahan. Akan tetapi pada lingkungan java 9 kode diatas pada saat dikompilasi akan menghasilkan pesan kesalahan seperti berikut :

src\latihan.modul\latihan\modul\dua\ProgramUtama.java:3: error: package javax.swing is not visible
import javax.swing.JFrame;
            ^
  (package javax.swing is declared in module java.desktop, but module latihan.modul does not read it)
1 error

Pada rilis java 9 ditetapkan aturan, jika modul yang kita buat membutuhkan modul lainnya, kita harus menyebutkan modul yang dibutuhkan tersebut dalam kode module-info.java menggunakan klausa requires.

Untuk kasus diatas, paket javax.swing ditampung dalam modul java.desktop, jadi disini kita perlu memodifikasi kode module-info.java menjadi seperti berikut :

module latihan.modul {
  requires java.desktop;
}

Arsip JAR

Kita dapat membuat java archive atau file .jar dari modul diatas dengan menggunakan perintah :

md dist
jar -c -f dist\latihan.modul.jar ^
  -e latihan.modul.dua.ProgramUtama ^
  -C build\latihan.modul\ .

Perintah diatas akan membuat file latihan.modul.jar pada folder dist dengan Main-Class adalah latihan.modul.dua.ProgramUtama yang sudah kita kerjakan sebelumnya.

Custom JRE

Kelebihan lain dari java 9 adalah kita bisa membuat runtime (JRE) khusus yang hanya berisi modul program disertai modul-modul API yang dibutuhkan. Dengan cara ini kita bisa mendistribusikan program disertai dengan JRE secara bersamaan. Keuntungan lain dari cara seperti ini, kita akan mendapatkan runtime dengan ukuran berkas yang lebih kecil.

Untuk membuat custom JRE kita akan menggunakan perintah jlink.exe seperti berikut :

jlink.exe ^
  --module-path "C:\Program Files\Java\jdk-10.0.1\jmods";dist ^
  --add-modules latihan.modul,java.base,java.desktop ^
  --output custom-jre ^
  --launcher launch=latihan.modul/latihan.modul.dua.ProgramUtama ^
  --verbose

Penjelasan :

  1. Pada opsi --module-path kita tentukan path dari modul yang akan dimasukkan kedalam JRE, disini kita gunakan dua buah path yaitu folder jmods dari direktori JAVA_HOME dan folder dist yang berisi arsip .jar dari modul yang sudah dibuat sebelumnya
  2. Pada opsi --add-modules kita menambahkan modul-modul yang akan digunakan dalam JRE, dalam hal ini : latihan.modul, java.base, dan java.desktop
  3. Opsi --output menentukan direktori yang akan menampung JRE baru dalam hal ini adalah folder custom-jre
  4. Opsi --launcher akan membuat skrip launch.bat yang akan mengeksekusi JRE dengan class java ProgramUtama
  5. Opsi --verbose akan menampilkan output dari proses