web-dev-qa-db-ja.com

Jlinkを使用して、あるプラットフォームで別のプラットフォーム用のランタイムイメージを作成するJavaランタイムイメージ

Linuxマシンでjlinkを使用してランタイムイメージを作成しました。 linuxフォルダーの下にincludeフォルダーがあります。 Linuxプラットフォームでのみこのランタイムイメージを使用できるということですか? 「はい」の場合、あるプラットフォームで別のプラットフォームにランタイムイメージを作成する方法はありますか(Linux for Windowsやその逆など)

19
Zimbo Rodger

includeディレクトリは、JNIおよびその他のネイティブインターフェイスを使用するC/C++コードをコンパイルするときに必要なjni.hなどのヘッダーファイル用です。 jlinkとは関係ありません。

jlinkツールは、別のプラットフォーム用のランタイムイメージを作成できます(クロスターゲティング)。これを行うには、2つのJDKをダウンロードする必要があります。 1つはjlinkを実行するプラットフォーム用で、もう1つはターゲットプラットフォーム用です。 jlink--module-path $TARGET/jmodsで実行します。ここで$TARGETは、ターゲットプラットフォームのJDKを解凍したディレクトリです。

25
Alan Bateman

一般に、情報に関してアラン・ベイトマンの答えに何も追加することができないので、私は実用的な例を提供します。 この例 は、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でビルドされています。

6
Michael Easter