17 votes

Créer une image d'exécution Java sur une plate-forme pour une autre en utilisant Jlink

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) ?

25voto

Alan Bateman Points 3303

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

6voto

Michael Easter Points 7482

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X