Mendistribusikan Aplikasi Yang Dibuat Dengan Griffon


Setelah kode program untuk sebuah aplikasi selesai dibuat, developer perlu menghasilkan file yang dapat didistribusikan sehingga aplikasi dapat dijalankan oleh pengguna.  Pada Java, umumnya aplikasi akan berupa file jar.   Griffon menyediakan perintah package yang berguna untuk keperluan ini.  Sebagai contoh, untuk menghasilkan sebuah file jar tunggal, saya dapat menggunakan perintah package jar;  untuk menghasilkan file zip yang memiliki launcher dan struktur direktori tertentu, saya dapat memberikan perintah package zip; dan sebagainya.

Tips:  Perintah package jar akan menghasilkan sebuah file jar tunggal dimana seluruh class dari plugin dan library yang dibutuhkan akan digabungkan menjadi satu.  Bila terdapat file dengan isi yang sama, maka isinya akan digabungkan (perilaku ini dapat dikonfigurasi).

Perintah package akan memakai konfigurasi yang diberikan di file griffon-app/conf/BuildConfig.groovy.  Apa saja pengaturan yang dapat diberikan?  Berikut ini adalah contoh isi file BuildConfig.groovy bawaan:

environments {
  development {
    ...
  }
  test {
    ...
  }
  production {
    signingkey {
      params {
        lazy = false
      }
    }
    griffon {
      jars {
        sign = true
        pack = true
        destDir = "${basedir}/staging"
      }
      webstart {
        codebase = "CHANGE ME"
      }
    }
  }
}

Perintah package secara default akan memakai nilai yang ada di environment production.

Konfigurasi lazy = false menyebabkan Griffon akan men-sign seluruh jar yang dihasilkan.  Secara default, keystore dihasilkan dengan nama griffon-app/conf/keys/productionKeystore.  Isinya adalah sebuah sertifikat self-signed dengan nama alias berupa production.  Sertifikat ini bukanlah sertifikat yang dapat dipercaya karena tidak diterbitkan oleh CA, melainkan oleh diri sendiri.

Proses signing dapat dihilangkan dengan memberikan nilai sign = false.  Walaupun demikian, signing sebaiknya tetap dilakukan karena dapat mencegah terjadinya perubahan file di dalam jar (oleh pihak yang tidak bertanggung jawab).  Seperti yang diketahui, file jar hanyalah sebuah file zip (file terkompresi) yang dapat dimodifikasi dengan mudah.  Bila sebuah file jar telah di-sign sebelumnya dan pihak tak bertanggung jawab melakukan perubahan terhadap isi di dalam file tersebut, maka Java akan memunculkan pesan kesalahan: Invalid or corrupt jarfile.

Lalu apa fungsi pack = true?  Konfigurasi ini akan menyebabkan Griffon memakai tools pack200.exe (bawaan JDK).  File jar yang dihasilkan akan lebih kecil karena memakai kompresi gzip.  Akan tetapi, saya menemukan sebuah masalah saat mengaktifkan fitur ini di sistem operasi Windows.  Griffon akan memanggil pack200 dengan parameter --segment-limit=-1 sehingga akan selalu menghasilkan satu file tak peduli berapa besar ukurannya.  Pada jar dengan ukuran besar, hal ini dapat menyebabkan terjadinya OutOfMemoryError: Java heap space.    Sayangnya, saya tidak menemukan cara mudah untuk mengatur penggunaan memori saat memanggil pack200 (sebagai informasi, ia dipanggil melalui ant.exec), sehingga cara yang paling gampang untuk mengatasi kesalahan ini adalah dengan memberikan nilai pack = false.

Konfigurasi lain yang berguna adalah menentukan nama file jar yang dihasilkan.  Secara default, nilai yang dipakai adalah:

griffon {
  jars {
     ...
     jarName = "${appName}.jar"
     ...
  }
}

Saya lebih suka menambahkan informasi versi pada nama file jar yang dihasilkan untuk mempermudah proses update nantinya.  Oleh sebab itu, saya mengubah baris di atas menjadi seperti berikut ini:

griffon {
  jars {
     ...
     jarName = "${appName}-${appVersion}.jar"
     ...
  }
}

Seperti yang diketahui, bila menggunakan package zip,  maka Griffon akan menghasilkan launcher berupa file batch seperti namaaplikasi.bat dan startApp.bat yang dapat dipakai untuk menjalankan aplikasi.  Pada kasus tertentu, saya perlu mengubah isi file launcher tersebut.  Misalnya, bila memakai SplashScreen bawaan Java, saya perlu menambahkan argumen -splash saat menjalankan aplikasi.   Tweaking juga perlu dilakukan agar launcher memanggil Java dengan perintah start /b dan memanggil javaw.exe sehingga tidak ada command prompt kosong yang terlihat menganggu.   Semua perubahan tersebut mewajibkan saya untuk mengubah isi file startApp.bat.   Bagaimana caranya?

Griffon akan menambahkan semua yang ada di folder griffon-app/conf/dist ke dalam hasil distribusi sesuai dengan nama folder yang mewakili jenis distribusi.  Sebagai contoh, bila menggunakan perintah package zip, maka isi di folder griffon-app/config/dist/zip akan ditambahkan ke dalam file zip nantinya.  Untuk itu, saya menambahkan file yang diperlukan, misalnya gambar untuk SplashScreen dan isi file startApp.bat yang telah dimodifikasi, seperti yang terlihat pada gambar berikut ini:

File yang akan ditambahkan pada hasil distribusi

File yang akan ditambahkan pada hasil distribusi

Secara default, bila file di griffon-app/conf/dist sudah ada di hasil distribusi, maka Griffon tidak akan menimpanya.  Ini menyebabkan file startApp.bat yang sudah saya ubah tidak akan disertakan pada file zip hasil distribusi.  Untuk mengatasi hal ini, saya terpaksa mengubah script Griffon (hal ini tidak direkomendasikan!).  Saya membuka file %GRIFFON_HOME%/scripts/Package.groovy, dan melakukan perubahan berikut ini:

_copyFiles = { srcdir, path ->
  ...
     ant.copy(todir: targetDistDir, overwrite: true) {
       ...
     }
  ...
}

Setelah ini, semua yang ada di griffon-app/conf/dist akan menimpa apa yang sudah di-generate sebelumnya.   Dengan demikian, file startApp.bat yang sudah saya modifikasi akan disertakan sebagai bagian dari file zip yang dihasilkan.

Bila saya memakai SplashScreen (bawaan Java sejak versi 6),  maka alangkah baiknya bila saya menampilkan versi aplikasi di SplashScreen tersebut.  Untuk mendapatkan versi aplikasi, saya dapat memanggil method getApplicationVersion() dari class Metadata. Kode program tersebut sebaiknya terletak di file griffon-app/lifecycle/Initialize.groovy. Berikut ini adalah contoh isinya:

SplashScreen splash = SplashScreen.splashScreen
if (splash) {
  Graphics2D g = splash.createGraphics()
  g.setColor(Color.Black)
  g.drawString("Versi ${app.metadata.getApplicationVersion()}", 35, 310)
  splash.update()
}

Untuk mengubah versi dari sebuah aplikasi, saya dapat menggunakan perintah seperti berikut ini:

griffon set-version 0.2

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: