web-dev-qa-db-fra.com

Créer une image d'exécution Java Java sur une plate-forme pour une autre à l'aide de Jlink

J'ai créé une image d'exécution en utilisant jlink sur ma machine Linux. Et je vois le dossier linux sous le dossier include. Cela signifie-t-il que je peux utiliser cette image d'exécution uniquement pour la plate-forme Linux? Si oui, existe-t-il des moyens de créer des images d'exécution sur une plate-forme pour une autre (par exemple sous Linux pour Windows et vice versa)

19
Zimbo Rodger

Le répertoire include est destiné aux fichiers d'en-tête, tels que jni.h, qui sont nécessaires lors de la compilation de code C/C++ qui utilise JNI et d'autres interfaces natives. Cela n'a rien à voir avec jlink.

L'outil jlink peut créer une image d'exécution pour une autre plateforme (ciblage croisé). Pour ce faire, vous devez télécharger deux JDK. Un pour la plate-forme sur laquelle vous exécutez jlink, l'autre pour la plate-forme cible. Exécutez jlink avec --module-path $TARGET/jmods$TARGET est le répertoire dans lequel vous avez décompressé le JDK pour la plate-forme cible.

25
Alan Bateman

N'étant généralement pas en mesure d'ajouter quoi que ce soit aux réponses d'Alan Bateman en termes d'informations, je proposerai un exemple pratique. Cet exemple illustre l'utilisation de jlink sur Mac OS, puis l'exécution du binaire sur Ubuntu dans un conteneur Docker.

Les points saillants sont les suivants.

Étant donné deux modules simples, nous compilons sur Mac OS:

javac -d build/modules \
--module-source-path src \
`find src -name "*.Java"`

jar --create --file=lib/[email protected] \
-C build/modules/net.codetojoy.db . 

jar --create --file=lib/[email protected] \
-C build/modules/net.codetojoy.service . 

En supposant que le JDK Linux 64 est décompressé dans un répertoire local (spécifié comme argument de ligne de commande), nous appelons jlink (sur Mac OS dans cet exemple). Java_HOME est le nœud de la solution:

# $1 is ./jdk9_linux_64/jdk-9.0.1
Java_HOME=$1 

rm -rf serviceapp 

jlink --module-path $Java_HOME/jmods:build/modules \
--add-modules net.codetojoy.service \
--output serviceapp

Ensuite, en supposant que nous avons extrait l'image ubuntu pour Docker, nous pouvons exécuter ce qui suit dans un terminal Docker (c'est-à-dire Linux):

docker run --rm -v $(pwd):/data ubuntu /data/serviceapp/bin/Java net.codetojoy.service.impl.UserServiceImpl

TRACER : hello from UserServiceImpl

Pour réitérer cette fonctionnalité de Java 9/jlink: Linux n'a pas Java installé et le binaire Linux a été construit sur Mac OS) .

6
Michael Easter