Mengoptimalkan Aplikasi Java 9 pada PLCnext Control Menggunakan Jlink
Dengan Java 9, alat baru yang disebut jlink diperkenalkan. Ini menggabungkan modul dan membangun image runtime all-in-one. Di satu sisi, seluruh 32 bit ARM JDK dapat dijalankan pada PLCnext Control. Namun dengan jlink dan modul memungkinkan untuk mengurangi sumber daya yang diperlukan untuk aplikasi Java Anda. Ini membuat bundel dengan hanya bagian yang diperlukan dari JDK yang dibutuhkan untuk aplikasi Anda.
Prasyarat
- JDK untuk sistem host Anda
- JDK untuk controller
Binary OpenJDK untuk banyak platform dapat ditemukan misalnya di AdoptOpenJDK. Untuk tutorial ini, kami memilih Linux arm32 jdk-12.0.2+10 untuk controller dan pelengkapnya untuk sistem host Windows x64. Kami menggunakan lokasi JDK berikut:
C: ---Java | +---jdk-12.0.2 | ... | ---jdk-12-ARM-32bit ...
Buat application module
Dalam contoh ini kita hanya mencetak Hello World di console. Untuk menggunakan jlink kita harus menempatkan aplikasi kecil ini ke dalam module. Titik awal saya di terminal adalah folder bernama "HelloWorld" dan folder src dengan struktur berikut.
HelloWorld ---src ---de.plcnext.hello | module-info.java | ---de ---plcnext ---hello HelloWorld.java
Ini adalah contoh kode kecil kita dalam file HelloWorld.java:
package de.plcnext.hello; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello PLCnext world!"); } }
Dan module-info.java diperlukan untuk membuat module:
module de.pxc.hello { }
Setelah membuat folder sumber kita mengkompilasi proyek kita. Untuk ini kita menggunakan perintah berikut di terminal.
C:Javajdk-12.0.2binjavac.exe -d .modulesde.plcnext.hello .srcde.plcnext.hellodeplcnexthelloHelloWorld.java .srcde.plcnext.hellomodule-info.java
Folder modules dan class Java dibuat:
HelloWorld ---modules ---de.plcnext.hello | module-info.class | ---de ---plcnext ---hello HelloWorld.class
Untuk menguji module kita pada sistem host, kita dapat menjalankannya dengan perintah berikut:
C:Javajdk-12.0.2binjava.exe --module-path .modules -m de.plcnext.hello/de.plcnext.hello.HelloWorld
Ini seharusnya menghasilkan Hello PLCnext world!.
Cara menggunakan jlink
Sekarang kita ingin memindahkan ini ke perangkat kita tanpa seluruh 300MB JDK. Untuk ini kita menggunakan jlink tanpa parameter tambahan di langkah pertama. Namun di awal kita membutuhkan informasi lebih lanjut, modul tambahan apa yang diperlukan. Ini kita akan ketahui dengan menganalisis module kita dengan jdeps.
C:Javajdk-12.0.2binjdeps.exe --module-path ".modules" --add-modules "de.plcnext.hello"
Ini memberitahu kami, kita membutuhkan java.base tambahan dari module kita. Sebagai module-path kita memilih jalur ke aplikasi kita dan jalur ke jmods dari JDK platform target kita. Dalam kasus ini C:Javajdk-12-ARM-32bitjmods.
Sekarang panggilan jlink kita terlihat seperti ini:
C:Javajdk-12.0.2binjlink.exe --module-path ".modules;C:Javajdk-12-ARM-32bitjmods" --add-modules "de.plcnext.hello,java.base" --output HelloWorldjre
Hasilnya adalah folder HelloWorldjre dengan hanya sekitar 45MB. Kita menyalin ini ke controller kita. Dalam kasus contoh ini ke /opt/plcnext/projects/java/. Kita perlu membuat file java di dalam folder binary HelloWorldjre dapat dieksekusi melalui chmod +x java dan memulai module kita
./java -m de.plcnext.hello/de.plcnext.hello.HelloWorld
Ini seharusnya menjalankan aplikasi dan menghasilkan output seperti sebelumnya Hello PLCnext world!. Dengan menggunakan beberapa parameter tambahan dari jlink Anda dapat mempersempak paketnya lebih jauh (dalam contoh ini hingga 28MB) dengan menggunakan --strip-debug, --no-header-files, --no-man-pages dan --compress=2. Di mana kompresi menghemat paling banyak tetapi dapat merugikan performa pada akhirnya.