◇JREを実行可能jarと同梱するサンプル
実行可能jarとJREを同梱し、リリースする
Javaの利用者プログラムを確実に動作させるにはビルドに使ったバージョンの実行環境が必要です。
必要バージョンを利用者環境で動作させるにはビルド環境のJDK上にあるjreフォルダを一緒にリリースし、その中のbin\javaまたはbin\javawで利用者プログラムを動かします。
実行可能jarにまとめられたGUIプログラムをJREと共にリリースする例を示します。
プログラムは次のもので、2つのライブラリを使っており、.jarにはライブラリも取り込んでいます。
// WinHello.java import otsu.hiSwing.*; import javax.swing.*; public class WinHello{ public static void main(final String[] args_){ SwingUtilities.invokeLater(new Runnable(){public void run(){start(args_);}}); } static void start(String[] args_){ L.set(new JFrame(),"title:単純試験","pack","visible","quit:終了しますか?", L.hPanel(L.label("Hello",L.monospace(40)),L.size(400,50))); } }
実行すると次のような画面が表示されます。
単純なhelloWorldプログラムをJREを同梱してリリースする例を◇JRE同梱helloWorldサンプルに置いてあります。
JREを含むリリースフォルダ
実行可能jarと起動バッチ(.bat)、コンソール表示なしの起動スクリプト(.vbs)およびJREを次の用にリリース用フォルダにまとめます。JREの同梱とはリリース物件に含めるということです。
WinHello\ | +-- WinHello.bat (起動バッチスクリプト) | +-- WinHello.vbs (DOS窓を出さずに起動するスクリプト) | +-- WinHello.jar (実行可能jar) | +-- jre\ (リリースに同梱されたJRE) | +-- bin\ | | | +-- java.exe (コンソールプログラム起動コマンド) | | | +-- javaw.exe (GUIプログラム起動コマンド) | | | :その他 | +-- lib\ | | | +-- ext\ (標準追加jarフォルダ) | | | : : :その他
起動バッチスクリプト.batは次の様に「同梱」JREのjava.exeを呼び利用者プログラムを動かします。
@echo off .\jre\bin\javaw.exe -jar WinHello.jar %*
コンソール表示(DOS窓)を出したくない場合、次の.vbsスクリプトを生成することも可能です。
CreateObject("WScript.Shell").Run ".\WinHello.bat",0
実行可能jarの作成
実行可能jarの作成自体は本記事の主眼ではありません。
ここでは以前の記事◇実行可能jarをWindowsバッチで作るのサンプルをほぼそのまま使用します。
Javaのバージョンを指定するところが、上記記事との違いです。
このスクリプト上のJDKバージョンを環境に合わせ書き換えた上で実行するとと、実行可能jarが作成されます。
作成された実行可能jarをJREと共にリリースフォルダに置くことになります。
リリースフォルダの生成スクリプト
次のバッチスクリプトでJREを「同梱」するリリースフォルダを生成しています。
JDKのバージョン(この例ではjdk1.8.0_171)は必要に応じ変更
広く配布するためには32bit版を用いる方が良いでしょう
@echo off pushd %~dp0 :: A10_release.bat ::------------------------------------------------------- :: リリースセットが%MAIN%フォルダに作成される :: %MAIN%フォルダには予めJRE環境と起動バッチファイル :: が置かれている。置かれていない場合はコピーする :: 既に作成されている%MAIN%.jarを%MAIN%フォルダにコピーする ::------------------------------------------------------- :: コンソールアプリの場合 JAVA=java.exe NO_CONSOLE=falseとすること set JAVA=javaw.exe set NO_CONSOLE=true ::--- set MAIN=WinHello set JDK=C:\Program Files (x86)\Java\jdk1.8.0_171 set USE_PAUSE=false set ZIP=true ::--- set JRE=%JDK%\jre ::------------------------------------------------------- :: リリース用フォルダの作成 ::------------------------------------------------------- echo check releas-folder %MAIN%\ if not exist %MAIN%\ ( mkdir %MAIN% if ERRORLEVEL 1 goto ERR ) if not exist .\%MAIN%\jre ( echo importing "%JRE%" xcopy "%JRE%" .\%MAIN%\jre /i/s/e/h if ERRORLEVEL 1 goto ERR ) echo @echo off > .\%MAIN%\%MAIN%.bat echo %%~dp0\jre\bin\%JAVA% -jar %%~dp0\%MAIN%.jar %%* >> .\%MAIN%\%MAIN%.bat if %USE_PAUSE% == true ( echo pause >> .\%MAIN%\%MAIN%.bat ) if %NO_CONSOLE% == true ( echo CreateObject^("WScript.Shell"^).Run ".\%MAIN%.bat",0 > .\%MAIN%\%MAIN%.vbs ) ::------------------------------------------------------- :: 実行jarをリリースフォルダに移行 ::------------------------------------------------------- move /Y %MAIN%.jar .\%MAIN%\ >NUL if ERRORLEVEL 1 goto ERR :::------------------------------------------------------- :: zip ::------------------------------------------------------- if %ZIP% == true ( echo create zip file %MAIN%.zip jar -cMf %MAIN%.zip %MAIN%\ if ERRORLEVEL 1 goto ERR ) :OK set result=0 echo === OK === goto END :ERR set result=1 echo === SOME ERROR OCCURED === :END @if not "%1"=="" goto NOPAUSE pause :NOPAUSE popd exit /b %result%
行っているのは次の作業です。
- リリース用のフォルダを作成し、JREのコピーと起動バッチを作成する
- 実行可能jarをリリース用フォルダにコピーする
- リリース用フォルダをzip化する
このバッチの設定項目は次の様になっています。
項目 | 説明 |
MAIN | main関数を持つクラスの名前です。.classを付けてはなりません。 |
JDK |
ターゲットとなるバージョンのJDKのパスを指定します。 通常jdk#.#.#_##という名です。 この配下のjavacでコンパイルされ、配下のjreがリリースに同梱(コピー)されます。 なお、リリースフォルダに既に"jre\"が存在するとjreのコピーは行われません。 |
JAVA |
利用者プログラムを起動するコマンドを指定します。 通常、コンソールプログラムの場合はjava.exeを指定し、GUIプログラムの場合はjavaw.exeを指定します。 デバグの要がある場合はGUIプログラムでもjava.exeを指定します。 この指定は起動バッチで使うコマンドとなります。 |
USE_PAUSE |
起動バッチの最後にpauseを置くかどうかを指定します。 trueとするとバッチの最後にpauseが置かれます。 pauseを置かない場合プログラム終了時にコンソール(DOS窓)が消えます。 |
NO_CONSOLE |
コンソール(DOS窓)を出さずにプログラムを起動します。 trueを指定するとコンソールを出さずに起動するための.vbsスクリプトが作成されます。 WinHelloはコンソールプログラムですのでこの指定は無意味です。 |
ZIP |
リリースフォルダをzipにまとめるかどうかを指定します。 trueとするとzipが作られます。 この例ではzipにする前のリリースフォルダのサイズは199Mバイト、内JREが198Mバイト、jarは228Kバイトです。 zipにすると75Mバイトとなります。 |
ソース、スクリプトセットのダウンロード、動作確認
ソース、スクリプトのセットを
jarWithJRE.zipに用意してあります。
右クリックし「対象をファイルに保存する」でダウンロードできます。
内容は次のものです。
jarWithJRE | +-- A00_clean.bat (リリースフォルダを含む二次ファイル削除) | +-- A01_build.bat (ビルドスクリプト) | +-- A05_run.bat (このフォルダでの動作確認) | +-- A10_release.bat (リリース) | +-- WinHello.java (プログラムソース) | +-- hiNote.jar (ライブラリ) | +-- hiSwing.jar (ライブラリ)
展開後、
- A01_build.bat上のJDKバージョン文字列を環境に合わせて変更し、
- A01_build.batを実行すると
その後、
- A01_release.bat上のJDKバージョン文字列を環境に合わせて変更し、
- A01_release.batを実行すると
jarWithJRE
|
+-- WinHello (リリースフォルダ)
| |
| +-- WinHello.bat (コンソール表示で起動)
| |
| +-- WinHello.vbs (コンソールなしの起動)
| |
| +-- WinHello.jar (実行可能jar)
| |
| +-- jre\ (同梱されたJRE)
|
+-- WinHello.zip (リリースフォルダのzip)
|
+-- A00_clean.bat (リリースフォルダを含む二次ファイル削除)
|
+-- A01_build.bat (ビルドスクリプト)
|
+-- A05_run.bat (このフォルダでの動作確認)
|
+-- A10_release.bat (リリース)
|
+-- WinHello.java (プログラムソース)
|
+-- hiNote.jar (ライブラリ)
|
+-- hiSwing.jar (ライブラリ)
生成されたリリースフォルダ(WinHello)を他のWindowsマシンに展開し、WinHello.vbsを起動すると、「Hello」文字列を持つGUI画面が表示されます。
利用者プログラムを実行するマシンにはJava環境は不要です。
| 固定リンク