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)
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
où $TARGET
est le répertoire dans lequel vous avez décompressé le JDK pour la plate-forme cible.
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) .