J'ai créé une image runtime en utilisant jlink sur ma machine Linux. Et je vois linux
sous le dossier include
dossier. Cela signifie-t-il que je ne peux utiliser cette image d'exécution que pour la plate-forme Linux ? Si oui, existe-t-il des moyens de créer des images d'exécution d'une plate-forme pour une autre (par exemple, de Linux pour Windows et vice versa) ?
Réponses
Trop de publicités?El 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
.
El 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
con --module-path $TARGET/jmods
où $TARGET
est le répertoire où 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'information, je vais proposer un exemple concret. Cet exemple illustre l'utilisation jlink
sur Mac OS, puis en exécutant le 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/net.codetojoy.db@1.0.jar \
-C build/modules/net.codetojoy.db .
jar --create --file=lib/net.codetojoy.service@1.0.jar \
-C build/modules/net.codetojoy.service .
En supposant que le JDK de 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 point central 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 qu'on a tiré le 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 caractéristique de Java 9/ jlink
: Linux n'a pas Java installé et le binaire Linux a été construit sur Mac OS.