Linuxマシンでjlinkを使用してランタイムイメージを作成しました。 linux
フォルダーの下にinclude
フォルダーがあります。 Linuxプラットフォームでのみこのランタイムイメージを使用できるということですか? 「はい」の場合、あるプラットフォームで別のプラットフォームにランタイムイメージを作成する方法はありますか(Linux for Windowsやその逆など)
include
ディレクトリは、JNIおよびその他のネイティブインターフェイスを使用するC/C++コードをコンパイルするときに必要なjni.h
などのヘッダーファイル用です。 jlink
とは関係ありません。
jlink
ツールは、別のプラットフォーム用のランタイムイメージを作成できます(クロスターゲティング)。これを行うには、2つのJDKをダウンロードする必要があります。 1つはjlink
を実行するプラットフォーム用で、もう1つはターゲットプラットフォーム用です。 jlink
を--module-path $TARGET/jmods
で実行します。ここで$TARGET
は、ターゲットプラットフォームのJDKを解凍したディレクトリです。
一般に、情報に関してアラン・ベイトマンの答えに何も追加することができないので、私は実用的な例を提供します。 この例 は、Mac OSでjlink
を使用してから、Dockerコンテナ内のUbuntuでバイナリを実行する方法を示しています。
主なポイントは次のとおりです。
2つの単純なモジュールを指定して、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 .
Linux 64 JDKがローカルディレクトリ(コマンドライン引数として指定)に展開されていると想定して、jlink
(この例ではMac OS)を呼び出します。 Java_HOME
は、解の核心です。
# $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
次に、Dockerのubuntu
イメージをプルしたと仮定すると、Dockerターミナル(Linuxなど)で次のコマンドを実行できます。
docker run --rm -v $(pwd):/data ubuntu /data/serviceapp/bin/Java net.codetojoy.service.impl.UserServiceImpl
TRACER : hello from UserServiceImpl
Java 9/jlink
のこの機能を繰り返すと、LinuxにはJavaがインストールされておらず、LinuxバイナリはMac OSでビルドされています。