« ◇プラモデル用三角スケール型紙 | トップページ | JTextPaneで変更結果イベントを拾う »

◇実行可能jarをWindowsバッチで作る

備忘録

 実行可能なjarをWindowsバッチで作成

ANTやEclipseを使わずにWindowsのバッチで実行可能jarを作成します。

参照ライブラリもjar内に同梱します。

バッチファイルの例を載せます。

@echo off
pushd %~dp0
::===============================================================
:: A01_build.bat
:: WindowsバッチでJavaプログラムのビルドを行い実行可能jarを作る
::   MAIN: メインクラス
::   LIBS: 参照するライブラリjar (展開し実行jarに取り込む)
::   JARS: jarに入れるもの ライブラリのフォルダやクラスファイル
::         jarの-cは参照カレントフォルダ変更なので通常は使わない
::   TMPS: 二次ファイルとして最後に削除するもの
::=============================================================== 
set MAIN=Test
set LIBS=.\hiNote.jar;.\hiSwing.jar;.\symphonie.jar
set SRCS=*.java
set JARS=otsu *.class
set TMPS=otsu;META-INF;*.class,manifest.txt
::===============================================================
::-------------------------------------------------------
:: コンパイル
::-------------------------------------------------------
javac -encoding utf8 -classpath .;%LIBS% %SRCS%
if ERRORLEVEL 1 goto ERR
::-------------------------------------------------------
:: ライブラリjarの展開
::-------------------------------------------------------
For %%a In (%LIBS%) Do (
   jar xvf %%a
   if ERRORLEVEL 1 goto ERR
)
::-------------------------------------------------------
:: jarにまとめる
:: 重要な注意! Main-Class:の後ろに1個空白が必要
::-------------------------------------------------------
echo Manifest-Version: 1.0 >  manifest.txt
echo Main-Class: %MAIN%    >> manifest.txt
jar  cvfm %MAIN%.jar manifest.txt %JARS%
if ERRORLEVEL 1 goto ERR
::===============================================================
:OK
set result=0
echo === OK ===
goto END
:ERR
set result=1
echo === SOME ERROR OCCURED ===
:END
::-------------------------------------------------------
:: 二次ファイル、フォルダを削除する
::   削除はまずdelでファイルを消し、rmdirでフォルダを消す
::-------------------------------------------------------
For %%a In (%TMPS%) Do (
   del /q %%a >NUL 2>&1
   rmdir /s /q %%a >NUL 2>&1
   if ERRORLEVEL 1 goto ERR
)
@if not "%1"=="" goto NOPAUSE
pause
:NOPAUSE
popd
exit /b %result%

このバッチは起動すると次の作業が行われます。

  1. コンパイルする
  2. ライブラリをjar同梱のために展開する
  3. manifestファイルを作成する
  4. コンパイル結果の.classとライブラリを展開したフォルダから実行可能jarを作る
  5. 一時ファイルとフォルダを削除する
なお、引数なしで起動されると最後にpauseするようになっています。

 実行可能jarの作成法

実行可能jarを作成するためには次の形式のmanifestファイルをjar作成時に参照する必要があります。

Manifest-Version: 1.0
Main-Class: メインプログラム名
Main-Class:の後ろに1個空白が必要であることに注意が必要です。

次のようにjarを作成します。

jar  cvfm ジャーファイル名 manifestファイル名 中に入れるフォルダやファイルの並び

 jarファイルの展開

ここでは3つのライブラリ

  • hiNote.jar
  • hiSwing.jar
  • symphonie.jar
を参照しています。
それらは"java -classpath"で参照されます。
コンパイルが完了した後、実行jarに同梱するため、"jar xvf"コマンドにより展開され、"jar cvfm"コマンドにより取り入れられます。
3つのライブラリはすべて"ostu"下になっていますので、jar cvfmではotsuのみを指定しています。
複数のフォルダになる場合はjar cvfmでは複数指定することになります。

なおライブラリのjarは先に展開しても構いませんがここではコンパイルが成功してから、「実行jarへの同梱のため」に展開するようにしました。

 サンプルプログラム

バッチファイルとサンプルプログラム、ライブラリは bacthCompile.zipに入っています。(右クリックし「対象をファイルに保存」でダウンロードできます)

A01_buils.batを起動するとTest.jarができます。
Test.jarをクリックすると「hello」と書かれた窓が開きます。
右上の[×]で終了できます。「終了しますか?」の確認ダイアログがでます。"はい"をクリックすると終了します。

プログラムは次のものです。

import otsu.hiSwing.*;
import javax.swing.*;
public class Test{
   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)));
      }
   }

A00_clear.batを起動するとTest.jarを含む二次ファイル群を削除します。

使ったライブラリは オツアンドサンズ が公開しているもので、 オツライブラリ に使い方の説明があます。ダウンロードもここからできます。

 ### 結局ここに戻る

ずっとANTを使っていたのですが、結局バッチの方が確実で簡単で、柔軟な対応が可能だと判断しました。
メンテナンスや移植を考えるとテキストで確認可能なANTがEclipseなどより圧倒的に優れているのですが、 それでも、柔軟性に欠け、変化についていけなくなります。

おバカなWindowsバッチに付き合うための基本事項

  • 文字コードはShift-JIS
  • ERRORLEVELは大文字でなければならない!errorlevelではだめ!!!
  • set文の=は前後に空白を入れてはいけない
  • 判断文の=は前後に空白を入れないといけない
  • delコマンドには">NUL 2>&1"を付加する必要がある

おバカなJavaの注意

  • javac -encoding utf-8 で文字コードを必ず指定する
  • javaコマンドでは.classは付けない
  • javaコマンドでは -cp . は必須

Windowsバッチはちょっとおバカすぎるとは言え、シンプルが一番!

少し話はずれるが。。
「フレームワーク」など言う甘い言葉に騙されて混乱を極めているプロジェクトを何度も見てきた。 結局最もシンプルですべてが分かる形を積み上げるのが一番確実で「長生き」もする。
「ビルド法やソース管理までフレームワークの一環になってしまっているものは使わない方が良い」と思う今日この頃。

|

« ◇プラモデル用三角スケール型紙 | トップページ | JTextPaneで変更結果イベントを拾う »

トラックバック


この記事へのトラックバック一覧です: ◇実行可能jarをWindowsバッチで作る:

« ◇プラモデル用三角スケール型紙 | トップページ | JTextPaneで変更結果イベントを拾う »