« ◇NW-A4xとWI-1000Xの設定 | トップページ | ◇JREを実行可能jarと同梱するサンプル »

◇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化する
JREのコピーは既にある場合は行わないようになっています。

このバッチの設定項目は次の様になっています。

項目 説明
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      (プログラムソース)

展開後、

  1. A01_buildRelease.bat上のJDKバージョン文字列を環境に合わせて変更し、
  2. 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にしました。

|

« ◇NW-A4xとWI-1000Xの設定 | トップページ | ◇JREを実行可能jarと同梱するサンプル »

トラックバック


この記事へのトラックバック一覧です: ◇JRE同梱helloWorldサンプル:

« ◇NW-A4xとWI-1000Xの設定 | トップページ | ◇JREを実行可能jarと同梱するサンプル »