- Contents -
この記事では、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アーカイブ化して配ればよい。