Java-Anwendung auf PLCnext Control
Mit Java 9 gibt es ein neues Tool namens jlink wurde vorgestellt. Es kombiniert Module und erstellt ein All-in-Runtime-Image. Einerseits kann das gesamte 32 Bit ARM JDK auf einer PLCnext Control ausgeführt werden. Aber mit jlink und Module ist es möglich, die für Ihre Java-Anwendung benötigten Ressourcen zu reduzieren. Es erstellt ein Paket mit nur den notwendigen Teilen des JDK, die für Ihre Anwendung benötigt werden.
Voraussetzungen
- JDK für Ihr Hostsystem
- JDK für den Controller
Die Binärdateien von OpenJDK für viele Plattformen finden Sie z. auf AdoptOpenJDK. Für dieses Tutorial haben wir Linux arm32 jdk-12.0.2+10 ausgewählt für den Controller und sein Pendant für ein Windows x64-Hostsystem. Wir verwenden den folgenden Speicherort der JDKs:
C:
---Java
|
+---jdk-12.0.2
| ...
|
---jdk-12-ARM-32bit
...
Erstellen Sie ein Anwendungsmodul
In diesem Beispiel drucken wir nur ein Hello World auf der Konsole. So verwenden Sie jlink wir müssen diese kleine Anwendung in ein Modul packen. Mein Ausgangspunkt auf dem Terminal ist ein Ordner namens „HelloWorld“ und ein src-Ordner mit der folgenden Struktur.
HelloWorld
---src
---de.plcnext.hello
| module-info.java
|
---de
---plcnext
---hello
HelloWorld.java
Dies ist unser kleines Codebeispiel in der HelloWorld.java-Datei:
package de.plcnext.hello;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello PLCnext world!");
}
}
Und die module-info.java wird benötigt, um das Modul zu erstellen:
module de.pxc.hello { }
Nach dem Erstellen des Quellordners kompilieren wir unser Projekt. Dazu verwenden wir auf dem Terminal folgenden Befehl.
C:Javajdk-12.0.2binjavac.exe -d .modulesde.plcnext.hello .srcde.plcnext.hellodeplcnexthelloHelloWorld.java .srcde.plcnext.hellomodule-info.java
Ein Modulordner und Java-Klassen werden erstellt:
HelloWorld
---modules
---de.plcnext.hello
| module-info.class
|
---de
---plcnext
---hello
HelloWorld.class
Um unser Modul auf dem Hostsystem zu testen, können wir es mit dem folgenden Befehl ausführen:
C:Javajdk-12.0.2binjava.exe --module-path .modules -m de.plcnext.hello/de.plcnext.hello.HelloWorld
Dies sollte Hello PLCnext world!
ausgeben .
Wie man jlink verwendet
Jetzt wollen wir dies ohne die ganzen 300 MB JDK auf unser Gerät bekommen. Dazu verwenden wir im ersten Schritt jlink ohne zusätzliche Parameter. Zunächst benötigen wir aber noch eine Information, welche Zusatzmodule benötigt werden. Das finden wir heraus, indem wir unser Modul mit jdeps analysieren.
C:Javajdk-12.0.2binjdeps.exe --module-path ".modules" --add-modules "de.plcnext.hello"
Das sagt uns, wir brauchen java.base
zusätzlich zu unserem Modul. Als module-path
Wir wählen den Pfad zu unserer Anwendung und den Pfad zu den jmods unserer Zielplattform JDK. In diesem Fall C:Javajdk-12-ARM-32bitjmods
.
Jetzt sieht unser jlink-Aufruf so aus:
C:Javajdk-12.0.2binjlink.exe --module-path ".modules;C:Javajdk-12-ARM-32bitjmods" --add-modules "de.plcnext.hello,java.base" --output HelloWorldjre
Das Ergebnis ist ein HelloWorldjre
Ordner mit nur ca. 45MB. Diese kopieren wir auf unseren Controller. In diesem Beispiel an /opt/plcnext/projects/java/
. Wir müssen die „Java“-Datei im HelloWorldjre-Binärordner über chmod +x java
ausführbar machen und starten Sie unser Modul
./java -m de.plcnext.hello/de.plcnext.hello.HelloWorld
Es sollte die Anwendung ausführen und wie vor Hello PLCnext world!
ausgeben . Durch die Verwendung einiger zusätzlicher Parameter von jlink können Sie das Paket noch weiter reduzieren (in diesem Beispiel auf 28 MB), indem Sie --strip-debug
verwenden , --no-header-files
, --no-man-pages
und --compress=2
. Wo ist die Komprimierung am sichersten, könnte aber am Ende der Leistung schaden.
Industrietechnik
- Steuerkreise
- Java-Operatoren
- Java-Schnittstelle
- Java-Versuch-mit-Ressourcen
- Java-Anmerkungen
- Java 10 - Teilen von Klassendaten
- 5 Vorteile der Fernsteuerung der Produktion
- Verwalten eines PLCnext Control-Geräts über SNMP
- So erstellen Sie eine einfache PLCnext-Konsolenanwendung in C#
- Clusterverwaltung auf PLCnext?