Java 9-apps optimaliseren op PLCnext Control met Jlink
Met Java 9 werd een nieuw tooltje genaamd jlink geïntroduceerd. Het combineert modules en bouwt een all-in-one runtime-image. Aan de ene kant kan de volledige 32-bit ARM JDK op een PLCnext Control draaien. Maar met jlink en modules is het mogelijk de benodigde resources voor je Java-applicatie te reduceren. Het creëert een bundle met alleen de noodzakelijke onderdelen van de JDK die je applicatie nodig heeft.
Vereisten
- JDK voor je hostsysteem
- JDK voor de controller
De binaire bestanden van OpenJDK voor veel platforms zijn te vinden op bijv. AdoptOpenJDK. Voor deze tutorial kozen we de Linux arm32 jdk-12.0.2+10 voor de controller en de equivalent voor een Windows x64 hostsysteem. We gebruiken de volgende locaties voor de JDK's:
C: ---Java
| +---jdk-12.0.2
| ...
| ---jdk-12-ARM-32bit
...
Een applicatiemodule maken
In dit voorbeeld printen we gewoon een Hello World op de console. Om jlink te gebruiken, moeten we deze kleine applicatie in een module stoppen. Mijn startpunt op de terminal is een map genaamd "HelloWorld" met een src-map met de volgende structuur:
HelloWorld
---src
---de.plcnext.hello
| module-info.java
| ---de
---plcnext
---hello
HelloWorld.java
Dit is onze kleine code in HelloWorld.java:
package de.plcnext.hello;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello PLCnext world!");
}
}
En de module-info.java is nodig om de module te maken:
module de.pxc.hello { }
Na het aanmaken van de src-map compileren we ons project. Hiervoor gebruiken we het volgende commando op de terminal:
C:\Java\jdk-12.0.2\bin\javac.exe -d .\modules\de.plcnext.hello .\src\de.plcnext.hello\de\plcnext\hello\HelloWorld.java .\src\de.plcnext.hello\module-info.java
Een modules-map en Java-classes worden aangemaakt:
HelloWorld
---modules
---de.plcnext.hello
| module-info.class
| ---de
---plcnext
---hello
HelloWorld.class
Om onze module op het hostsysteem te testen, kunnen we het draaien met:
C:\Java\jdk-12.0.2\bin\java.exe --module-path .\modules -m de.plcnext.hello/de.plcnext.hello.HelloWorld
Dit zou Hello PLCnext world! moeten outputten.
Hoe jlink te gebruiken
Nu willen we dit op ons device krijgen zonder de volledige 300 MB JDK. Daarvoor gebruiken we jlink zonder extra parameters in de eerste stap. Maar eerst hebben we één meer informatie nodig: welke additionele modules nodig zijn. Dat ontdekken we door onze module te analyseren met jdeps.
C:\Java\jdk-12.0.2\bin\jdeps.exe --module-path ".\modules" --add-modules "de.plcnext.hello"
Dit vertelt ons dat we java.base naast onze module nodig hebben. Als module-path kiezen we het pad naar onze applicatie en het pad naar de jmods van onze target-platform JDK. In dit geval C:\Java\jdk-12-ARM-32bit\jmods.
Nu ziet onze jlink-oproep er zo uit:
C:\Java\jdk-12.0.2\bin\jlink.exe --module-path ".\modules;C:\Java\jdk-12-ARM-32bit\jmods" --add-modules "de.plcnext.hello,java.base" --output HelloWorldjre
Het resultaat is een HelloWorldjre-map van slechts ongeveer 45 MB. We kopiëren dit naar onze controller. In dit voorbeeld naar /opt/plcnext/projects/java/. We moeten het bestand "java" in de HelloWorldjre/bin-map uitvoerbaar maken via chmod +x java en starten onze module:
./java -m de.plcnext.hello/de.plcnext.hello.HelloWorld
Het zou de applicatie moeten draaien en outputten zoals eerder Hello PLCnext world!. Door enkele extra parameters van jlink kun je het pakket nog verder inkrimpen (in dit voorbeeld naar 28 MB) door --strip-debug, --no-header-files, --no-man-pages en --compress=2 te gebruiken. Waarbij compressie het meest bespaart, maar de prestaties op het einde kan beïnvloeden.
Industriële technologie
- Regelschakelingen: Fundamenten, Toepassingen en Best Practices
- 5 Belangrijkste voordelen van externe productiecontrole voor de moderne industrie
- PLCnext Control Apparaten Optimaliseren met SNMP: Een Praktische Gids
- PLCnext Console-applicatie Ontwikkelen met C#: Handleiding voor Beginners
- Clusterbeheer op PLCnext: Kubernetes Benutten voor Industriële Automatisering
- Java 9-apps optimaliseren op PLCnext Control met Jlink
- Java-operators beheersen: typen, syntax en praktische voorbeelden
- Java interfaces meesteren: concepten, implementatie en best practices
- Java Try-with-resources meesteren: automatische resource management uitgelegd
- Java Annotaties uitgelegd: typen, plaatsing en praktische voorbeelden
- Java 10: Prestatieverbetering met Class-Data Sharing (CDS)