Application Java sur PLCnext Control
Avec Java 9, un nouvel outil appelé jlink a été présenté. Il combine des modules et crée une image d'exécution complète. D'une part, l'ensemble du JDK ARM 32 bits peut être exécuté sur un PLCnext Control. Mais avec jlink et modules, il est possible de réduire les ressources nécessaires à votre application Java. Il crée un bundle avec uniquement les parties nécessaires du JDK nécessaires à votre application.
Prérequis
- JDK pour votre système hôte
- JDK pour le contrôleur
Les binaires d'OpenJDK pour de nombreuses plates-formes peuvent être trouvés, par ex. sur AdoptOpenJDK. Pour ce tutoriel, nous avons choisi le Linux arm32 jdk-12.0.2+10 pour le contrôleur et son pendentif pour un système hôte Windows x64. Nous utilisons l'emplacement suivant des JDK :
C:
---Java
|
+---jdk-12.0.2
| ...
|
---jdk-12-ARM-32bit
...
Créer un module d'application
Dans cet exemple, nous imprimons simplement un Hello World sur la console. Pour utiliser jlink nous devons mettre cette petite application dans un module. Mon point de départ sur le terminal est un dossier appelé "HelloWorld" et un dossier src avec la structure suivante.
HelloWorld
---src
---de.plcnext.hello
| module-info.java
|
---de
---plcnext
---hello
HelloWorld.java
Voici notre petit exemple de code dans le fichier HelloWorld.java :
package de.plcnext.hello;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello PLCnext world!");
}
}
Et le module-info.java est nécessaire pour créer le module :
module de.pxc.hello { }
Après avoir créé le dossier source, nous compilons notre projet. Pour cela, nous utilisons la commande suivante sur le terminal.
C:Javajdk-12.0.2binjavac.exe -d .modulesde.plcnext.hello .srcde.plcnext.hellodeplcnexthelloHelloWorld.java .srcde.plcnext.hellomodule-info.java
Un dossier de modules et des classes java sont créés :
HelloWorld
---modules
---de.plcnext.hello
| module-info.class
|
---de
---plcnext
---hello
HelloWorld.class
Pour tester notre module sur le système hôte, nous pouvons l'exécuter avec la commande suivante :
C:Javajdk-12.0.2binjava.exe --module-path .modules -m de.plcnext.hello/de.plcnext.hello.HelloWorld
Cela devrait afficher Hello PLCnext world!
.
Comment utiliser jlink
Maintenant, nous voulons obtenir cela sur notre appareil sans l'ensemble du JDK de 300 Mo. Pour cela, nous utilisons jlink sans aucun paramètre supplémentaire dans la première étape. Mais d'abord, nous avons besoin d'une information supplémentaire, quels modules supplémentaires sont nécessaires. Nous le découvrirons en analysant notre module avec jdeps.
C:Javajdk-12.0.2binjdeps.exe --module-path ".modules" --add-modules "de.plcnext.hello"
Cela nous dit, nous avons besoin de java.base
en plus de notre module. Comme module-path
nous choisissons le chemin vers notre application et le chemin vers les jmods de notre plate-forme cible JDK. Dans ce cas C:Javajdk-12-ARM-32bitjmods
.
Maintenant, notre appel jlink ressemble à ceci :
C:Javajdk-12.0.2binjlink.exe --module-path ".modules;C:Javajdk-12-ARM-32bitjmods" --add-modules "de.plcnext.hello,java.base" --output HelloWorldjre
Le résultat est un HelloWorldjre
dossier avec seulement environ 45 Mo. Nous le copions dans notre contrôleur. Dans le cas de cet exemple à /opt/plcnext/projects/java/
. Nous devons rendre le fichier "java" dans le dossier binaire HelloWorldjre exécutable via chmod +x java
et démarrez notre module
./java -m de.plcnext.hello/de.plcnext.hello.HelloWorld
Il devrait exécuter l'application et la sortie comme avant Hello PLCnext world!
. En utilisant des paramètres supplémentaires de jlink, vous pouvez réduire encore plus le paquet (dans cet exemple jusqu'à 28 Mo) en utilisant --strip-debug
, --no-header-files
, --no-man-pages
et --compress=2
. Où sont les coffres-forts de compression les plus mais pourraient nuire à la performance à la fin.
Technologie industrielle