◇JRE同梱helloWorldサンプル
JREを同梱し、リリースする
Javaの利用者プログラムを確実に動作させるにはビルドに使ったバージョンの実行環境が必要です。
必要バージョンを利用者環境で動作させるにはビルド環境のJDK上にあるjreフォルダを一緒にリリースし、その中のbin\javaまたはbin\javawで利用者プログラムを動かします。
次のプログラムをコンパイルしJREと共にリリースする例を示します。
// HelloWorld.java public class HelloWorld { static public void main(String[] args_){ System.out.println("Hello World"); } }実行可能jarと共にリリースするやや実用に近い例は次回の記事 ◇JREを実行可能jarと同梱するサンプル で示します。
JREを含むリリースフォルダ
利用者プログラム(.class)と起動バッチ(.bat)およびJREを次の用にリリース用フォルダにまとめます。JREの同梱とはリリース物件に含めるということです。
HelloWorld\ | +-- HelloWorld.bat (起動バッチスクリプト) | +-- (HelloWorld.vbs) (DOS窓を出さずに起動するスクリプト:指定時のみ) | +-- HelloWorld.class (コンパイルされた利用者プログラム) | +-- jre\ (リリースに同梱されたJRE) | +-- bin\ | | | +-- java.exe (コンソールプログラム起動コマンド) | | | +-- javaw.exe (GUIプログラム起動コマンド) | | | :その他 | +-- lib\ | | | +-- ext\ (標準追加jarフォルダ) | | | : : :その他
起動バッチスクリプト.batは次の様に「同梱」JREのjava.exeを呼び利用者プログラムを動かします。
@echo off .\jre\bin\java.exe -classpath . HelloWorld %* pause
コンソール表示(DOS窓)を出したくない場合、次の.vbsスクリプトを生成することも可能です。
CreateObject("WScript.Shell").Run ".\HelloWorld.bat",0
リリースフォルダの生成スクリプト
次のバッチスクリプトでJREを「同梱」するリリースフォルダを生成しています。
JDKのバージョン(この例ではjdk1.8.0_171)は必要に応じ変更
広く配布するためには32bit版を用いる方が良いでしょう
@echo off pushd %~dp0 :: A01_buildRelease.bat ::------------------------------------------------------- :: リリースセットが%MAIN%フォルダに作成される :: %MAIN%フォルダには予めJRE環境と起動バッチファイル :: が置かれている。置かれていない場合はコピーする :: %MAIN%.javaをコンパイルし%MAIN%classを :: %MAIN%フォルダにコピーする :: JDKには32bit版を使う方が実行環境の制限が少ない ::------------------------------------------------------- set MAIN=HelloWorld set JDK=C:\Program Files (x86)\Java\jdk1.8.0_171 set JAVA=java.exe set USE_PAUSE=true set NO_CONSOLE=false set ZIP=true ::--- set JRE=%JDK%\jre set JAVAC=%JDK%\bin\javac.exe ::------------------------------------------------------- :: リリース用フォルダの作成 ::------------------------------------------------------- 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 .\jre\bin\%JAVA% -classpath . %MAIN% %%* >> .\%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 ) ::------------------------------------------------------- :: コンパイル、リリース用フォルダへのコピー ::------------------------------------------------------- echo compile "%JAVAC%" -encoding utf8 *.java if ERRORLEVEL 1 goto ERR echo move class files move /Y *.class .\%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のコピーと起動バッチを作成する
- 利用者プログラムをコンパイルしリリース用フォルダにコピーする
- リリース用フォルダを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スクリプトが作成されます。 HelloWorldはコンソールプログラムですのでこの指定は無意味です。 |
ZIP |
リリースフォルダをzipにまとめるかどうかを指定します。 trueとするとzipが作られます。 この例ではzipにする前のリリースフォルダのサイズは198Mバイト、内JREが198Mバイト、classは1Kバイトです。 zipにすると75Mバイトとなります。 |
ソース、スクリプトセットのダウンロード、動作確認
ソース、スクリプトのセットを
classWithJRE.zipに用意してあります。
右クリックし「対象をファイルに保存する」でダウンロードできます。
内容は次のものです。
classWithJRE | +-- A00_clean.bat (リリースフォルダを含む二次ファイル削除) | +-- A01_buildRelease.bat (ビルドスクリプト) | +-- HelloWorld.java (プログラムソース)
展開後、
- A01_buildRelease.bat上のJDKバージョン文字列を環境に合わせて変更し、
- A01_buildRelease.batを起動すると、
classWithJRE
|
+-- HelloWorld (リリースフォルダ)
| |
| +-- HelloWorld.bat
| |
| +-- HelloWorld.class
| |
| +-- jre\ (同梱されたJRE)
|
+-- HelloWorld.zip (リリースフォルダのzip)
|
+-- A00_clean.bat (リリースフォルダを含む二次ファイル削除)
|
+-- A01_buildRelease.bat (ビルドスクリプト)
|
+-- HelloWorld.java (プログラムソース)
生成されたリリースフォルダ(HelloWorld)を他のWindowsマシンに展開し、HelloWorld.batを起動すると、コンソール(DOS窓)に"Hello World"と出力されます。
利用者プログラムを実行するマシンにはJava環境は不要です。
同梱、bundle、include
Launch4jというツールを使うと利用者プログラムを.exeにまとめることができます。
Launch4jの説明ではjreをbundleできるとなっていますが、これは.exeにjreをincludeできるわけではなく、jreを相対フォルダ指定ができるので、.exeと一緒にjreを配布すれば(即ち配布セットに同梱すれば)それを使うことができるという意味のようです。
bundleは紐づけであってincludeではないのです。
雑談、yes/no、true/false
論理ハンドリング記述は英語のyes/noを使うと訳が分からなくなります。
NO_CONSOLEの否定はnoかyesか?true、false、真、偽、はい、いいえなら分かるのですが。
HIDE_CONSOLEとかにすべきなんでしょうけど、yes/no使わず論理語であるtrue/falseにしました。
| 固定リンク