Java クロスプラットフォーム ビルドの方法

この記事では、Java9以降のアプリケーションを、
各プラットフォーム(Windows, Linux, Mac)向けにビルドする方法。

クロスプラットフォームビルドで、
カスタムランタイムを作成する方法について解説します。

クロスプラットフォーム ビルドとは

Cross Platform Buildとは、
例えば、配布先が Windowsであっても、
MacOS上でコンパイル・ビルドして、配布用にパッケージングする事ができます。

配布先プラットフォームと異なる環境で、配布用のパッケージングが行えるのです。

Javaは、モジュールシステムを導入した事により、
ネイティブコードも含むJMODというファイルを持つようになりました。
そして、Javaのランタイムコード自体モジュール化されています。

それにより、jlinkコマンドでこれらのモジュールを組み合わせる事で、実行可能ファイルを
別のプラットフォーム向けにでも生成することが可能になっています。

カスタムランタイムとは

今回は、クロスプラットフォームビルドにフォーカスした記事にするので、
カスタムラインタイム(JIMAGE)の基本的な作り方は、こちらの前回書いた記事を参考にしてください。
>> カスタムランタイム作成の基礎

クロスプラットフォーム ビルドの仕方

ここから、クロスプラットフォームビルドの具体的なやり方について、説明していきます。

OpenJDKの取得

まず、配布先プラットフォームのJDK (Java Development Kit)が必要になります。
厳密にいうと、配布先プラットフォームのネイティブコードが含まれた、
JMODファイルが必要になります。

Java自体のJMODファイルは、JDKのjmodsというディレクトリに存在します。

OpenJDKのファイルツリー

$ tree -L3 OpenJDK/Windows/jdk-11.0.6+10

├── bin
│   ~ 省略 ~
│   ├── jar.exe
│   ├── java.dll
│   ├── java.exe
│   └── zip.dll
├── jmods
│   ~ 省略 ~
│   ├── java.base.jmod
│   ├── jdk.xml.dom.jmod
│   └── jdk.zipfs.jmod
├── conf
│   ~ 省略 ~
├── demo
│   ~ 省略 ~
├── include
│   ~ 省略 ~
├── legal
│   ~ 省略 ~
├── lib
│   ~ 省略 ~
└── release

JDKは、オラクルもOpenJDKという形で提供していますが、
私のおすすめは、Adopt OpenJDKから、ダウンロードするのがわかりやすい。

AdoptOpenJDK (Windows, Linux, Mac)
Java11のOpenJDKへのダウンロードリンクを載せておきます。
>> AdoptOpenJDKダウンロード

ターゲットになる、配布先プラットフォームのJDKをダウンロードしましょう。

AdoptOpenJDKダウンロード画面

.tar.gz もしくは、.zipファイルを解凍して、
その中のjmodsディレクトリ内の、JMODファイルが必要になります。

jlinkでカスタムランタイムを作成

カスタムランタイム(JIMAGE)を作成する為には、jlinkコマンドを使います。
クロスプラットフォームビルドの時に重要なのは、配布先プラットフォーム用のJMODファイルとリンクさせる事です。

そのため、 --module-pathオプションには、先程ダウンロードした
配布先プラットフォームのJDKに含まれれるJMODファイルの場所を指定します。

jlinkの実行コマンド例

jlink \
    --module-path ~/Downloads/Windows/jdk-11.0.6+10/jmods:out/jmods \
    --add-modules net.tyablog.sample  \
    --launcher sample=net.tyablog.sample/net.tyablog.sample.Sample \
    --compress=2 \
    --no-header-files \
    --no-man-pages \
    --output out/jimage/Windows

※jlinkコマンド自体は、ビルド環境にインストールされているコマンドを使います。

  • ~/Downloads/Windows/jdk-11.0.6+10/jmodsが、
    配布先プラットフォームのJDKに含まれているJMODファイルの場所です。

  • この例のout/jmods は、自身のアプリケーションをJMODファイル化したディレクトリになります。
    JMODファイルじゃなくても、モジュール化したJARファイルを指定するでもOK。

  • --launcherオプションで、起動スクリプトの作成を指定しています。

  • 出力先には、out/jimage/Windowsを指定していますが、お好きなディレクトリで大丈夫。

各プラットフォーム用にビルドする例

各プラットフォーム毎に、jlinkコマンドを使った例を載せておきます。

for Mac

jlink \
    --module-path ~/Downloads/Darwin/jdk-11.0.6+10/jmods:out/jmods \
    --add-modules net.tyablog.sample  \
    --launcher sample=net.tyablog.sample/net.tyablog.sample.Sample \
    --compress=2 \
    --no-header-files \
    --no-man-pages \
    --output out/jimage/Darwin

for Windows

jlink \
    --module-path ~/Downloads/Windows/jdk-11.0.6+10/jmods:out/jmods \
    --add-modules net.tyablog.sample  \
    --launcher sample=net.tyablog.sample/net.tyablog.sample.Sample \
    --compress=2 \
    --no-header-files \
    --no-man-pages \
    --output out/jimage/Windows

for Linux

jlink \
    --module-path ~/Downloads/Linux/jdk-11.0.6+10/jmods:out/jmods \
    --add-modules net.tyablog.sample  \
    --launcher sample=net.tyablog.sample/net.tyablog.sample.Sample \
    --compress=2 \
    --no-header-files \
    --no-man-pages \
    --output out/jimage/Linux

配布方法

JIMAGEを作成したあと、配布するには、Zipアーカイブなどして、配るのが良いでしょう。
配布先で解凍してから、binディレクトリ内のjavaコマンド、もしくは起動スクリプトを実行して
問題なく動くか確認してみましょう。

まとめ

  • カスタムランタイム(JIMAGE)にすると、そのまま配布するだけで実行可能な形にできる。

  • jlinkコマンドでJMODファイルを指定して、カスタムランタイムを生成できる。
    クロスプラットフォームビルドするには、配布先プラットフォームのJDK(JMODファイル)が必要になる。
    jlinkコマンドで、--module-pathにそれらのJMODファイルを指定する。

  • 配布先には、Zipアーカイブ化して配ればよい。

コメントを残す