« ◇JRE同梱helloWorldサンプル | トップページ | ■動画で見る光速有限性による高速移動体の歪み »

◇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化する
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スクリプトが作成されます。
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     (ライブラリ)

展開後、

  1. A01_build.bat上のJDKバージョン文字列を環境に合わせて変更し、
  2. A01_build.batを実行すると
コンパイル、実行可能jarの作成が行われます。

その後、

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

|

« ◇JRE同梱helloWorldサンプル | トップページ | ■動画で見る光速有限性による高速移動体の歪み »

トラックバック


この記事へのトラックバック一覧です: ◇JREを実行可能jarと同梱するサンプル:

« ◇JRE同梱helloWorldサンプル | トップページ | ■動画で見る光速有限性による高速移動体の歪み »