【Java】超今頃になって「JSmooth」を使ってみる。

 4月に入ってから、現在の仕事場に移っております。まだまだまだまだわからない点だらけですが、何とかやっております(汗)。

 さて、当初はWeb系でPHPの仕事とか訊いていたような気がしており、現場に入ったらJavaのお仕事と言われたものの、実は大して経験のないシェルスクリプトをいじる時間が一番長いという訳のわからないことになっております(爆)。

 さて、そのシェルスクリプトを、いわゆる開発者以外の人でも呼び出せるように、Windows端末にGUIのツールを設置することになったわけですが、特に言語やツールの指定がなかったので、言語としては最も慣れ親しんでいる(上に追加投資が不要な)Javaで作ろうと思ったら、あら大変。

 Java言語には、標準ではSSHをたたく機能がありません。もっとも、これについては「Ganymed SSH-2 for Java」というライブラリでどうにかなりました。なお、今回はこれに関する説明はいたしません 1)さすがに自宅からでは可能だとしても試す気にならないし、ましてやブログの記事にするなど内容的にもってのほか 。下記のサイトとAPIドキュメントを参考にすれば、基本的なことはできてしまいます。

ライブラリ配布元
Ganymed SSH-2 for Java
参考記事
Java で ssh や scp を呼び出す(1)Mi manca qualche giovedi`? (ここからさらに続きの記事へのリンクがあります)

 仕事場では、Eclipse上でこのライブラリと「WindowBuilder」、「SWT」を駆使して、気張ってツールを作ったまではよいのですが、よくよく考えたら、ツールを動作させるためには当然ながらJavaの実行環境が必要です。

 いちいちそんなの、Javaが入っていない端末を使っている人にインストールしてねとお願いするのも面倒ですし(ぉぃ) 2)実は私が仕事場で使っている端末でも、つい最近までEclipse同梱のJREしか入っていなかった 、ましてやこっちがインストールして回るなんてもってのほか。

 というわけで、何とかWindowsのEXEファイルとして配布できないかと思いました。

 ところが、残念ながらJavaの標準機能では、Windowsのネイティヴ・アプリケーションを生成する機能なんてありません。それでは外部のツールでできないかと思いきや、これも高価なパッケージが必要らしい…。

 ではせめて、Javaの実行環境をバンドルするようなものでもいいから何かないかと思い、やっと探し当てたのがこれ。「JSmooth」です。

JSmooth .exe Wrapper

JSmooth .exe Wrapper

 これは、JavaのソースコードからWindowsのネイティヴ・アプリケーションを生成してくれるツールではなく、「.exe Wrapper」という言葉が指し示すように、Java実行環境から呼び出される「.jar」ファイルをラップするだけのものです。

 普通にJavaの実行環境が入っていれば、Windowsでは「.jar」ファイルをダブルクリックすればとりあえずJavaで書いたプログラムを呼び出せるので、こんなの不要なのですが、実行環境のない端末上でも面倒なJavaのインストール無しにJavaのプログラムを使ってもらうために必要となります。

 なんで今頃こんなことを申し上げるのかといいますと、私はJava言語による開発経験こそ6年間(中抜け期間を除く)あるのですが、そのすべてがWebアプリケーションの開発であり、GUIなんて触ったことすらないまま、成り行きでGUIツールを作ることになってしまったためであります。

 これから先は、Eclipse上でWindowBuilderやSWTを用いてJavaのGUIアプリケーション開発をおこない、実行可能な「.jar」ファイルを生成していることを前提に話を進めます。

 まず、JSmoothの最新版をダウンロードします。

 最新版は2007年5月20日公開。もうそろそろ5年経過してしまうのですが、そんなことを気にしている余裕はありません。

 ダウンロードしたらそのまま普通にインストールし、起動しましょう。

 ところが、Windows用の32ビット版のJava実行環境が入っていない端末では、インストールするかどうかたずねられます。しかも、たずねられたまんま答えを返してもほったらかしにされることがあります。また、64ビット版「のみ」が入った環境や、Eclipseに同梱されたもの等、インストーラを使ってインストールされていない環境しかない場合でも、同じ質問がされます。非常にうっとうしいので、あらかじめ32ビット版のJava実行環境をインストールしておきましょう。

 何とかやっとの思いでJSmoothを起動できたと思ったら、全部英語。これだけでもやる気を削がれるのですが、めげずに進みましょう。

Weclome

 ようこそ。ここはこのバージョンの説明その他ですね。

Skeleton

 スケルトンを選べとあります。

 Windows向けのGUIアプリケーションを作ったなら、「Windows Wrapper」を選択します。ほかは使ったことがないのでよくわかりません(ぉぃ)。

Skeleton

Executable

 ここから先がくせ者です。ここでは、次の設定をおこないます。

Executable Binary
出力するEXEファイルをフルパスで指定します。
…先に入力ファイルを指定させないのはなぜなんでしょうね?
Executable Icon
EXEファイルに表示させるアイコン画像を指定します。一般的な画像形式を指定できるようです 3)私はPNGでしか試していないけど
なぜか、Windows標準の「.ico」アイコンファイルを指定することはできないようです。
Current Directory
プログラム実行ディレクトリです。下のチェックボックスをONにすればよいと思います。

Executable

Application

 ここの設定はさらにくせ者です。

 実行可能なJARファイルを元にEXEファイルを生成する場合、まず初めに「Embbeded jar settings4)原文ママ を設定する必要があります。

 「Use an embedded jar」のチェックをONにし、JARファイルを選択します。

 そのあと、画面上部の「Application Settings」に移動し、次の設定をおこないます。

Main class
最初に呼び出される「public static viod main(String[] args)」メソッドが存在するClassの名前を指定します。
…はずなのですが、それではうまく行きませんでした。詳しくは後述。
Application Arguments
アプリケーション引数を指定します。GUIのアプリケーションではあんまり使う機会もないでしょう。

 あと、Classpathの設定もおこなえますが、今回はここには何も指定しないことにします。

Application

JVM Selection

 まず、「Java version settings」では、動作対象となるJav実行環境のバージョンの最低と最高を指定します。

 省略可能ですが、指定する場合は、「Minimu JVM Version」側に、実際に開発をおこなった時に用いたJREのバージョン(1.5等)を記載すればよいと思われます。

 次が少々ややこしい。「JRE (it bundled with your application)」とありますが、どうもこれはEXEファイルの中にJava実行環境を丸ごと含めてくれるわけではないようです。プログラムがJava実行環境を探すときに真っ先に探しに行くディレクトリを指定するようです。

 もし、Java実行環境がインストールされていない環境への配布をおこなう場合、EXEファイルを生成するディレクトリと同じ階層にJavaがインストールされているディレクトリ 5)たとえば「C:\Program Files (x86)\Java\jre6\ をコピーし、それをEXEファイルと一緒にCD-ROMに焼くなりZIPで固めるなりして配布することを前提としていると思われます。

 そのため、JREをアプリケーションと同梱させる場合、「JRE (it bundled with your application)」欄は相対パスで指定しましょう。

 「JVM Search Sequence」は、特に変更する必要もないでしょう。

JVM Selection

JVM Configur…

 メモリやJavaのプロパティについて設定できるようですが、今回は特に何も指定しません。

JVM Configur...

いよいよコンパイル

 最低限、これだけの設定をおこなったら、「System」→「Save as…」で設定ファイルを保存します 6)これは必ずEXEを生成するディレクトリと同じ階層に保存すること

 保存できましたら、「Project」→「Compile…」で、EXEファイルの生成を実行します。

Done

 「Dpme」と表示されれば成功。さて、生成されたプログラムを実行してみましょう。

 ところが…

Could not find the main class:

[tegaki color=”#ff0000″]ハァ!?(-_-#)凸[/tegaki]

 俺はちゃんと「public static viod main(String[] args)」メソッドが存在するClassの名前を指定したんだぞ! 文句あっか!?

 何度確認して、何度EXE生成をやり直しても、うまく行きません。

 行き詰まった俺様は、JARファイルの中に圧縮されている「META-INF\MANIFEST.MF」ファイルの内容を覗いてみました。

Manifest-Version: 1.0
Rsrc-Class-Path: ./ org.eclipse.swt.win32.win32.x86_64_3.7.2.v3740f.ja
r
Class-Path: .
Rsrc-Main-Class: com.telmina.garden.md5.MD5Sample
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

 最後の行がくせ者で、内部的には、俺様が苦労して書き上げた(ぉぃ)プログラム内のmain()メソッド(この例では「com.telmina.garden.md5.MD5Sample#main(String[])」)ではなく、Eclipseが追加したクラス「org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader」の内容がさらに先に読み取られるようですね。なので、この内容を、先ほどの「Application」→「Main Class」に指定します。

やっとアプリケーションが起動した!

やっとアプリケーションが起動した!

 やっとアプリケーションが起動しました。

 試しに、生成したEXEファイルと、Javaがインストールされているフォルダ(今回は64ビット版のJava実行環境を使う前提のため、「C:\Program Files\Java\jre6\」)からコピーしたフォルダを同梱して、先日購入したばかりで、Javaの実行環境がインストールされていないウルトラブックPCにコピーして動かしてみたところ、成功しました。

 なお、実行ファイルの場所を移動させるなどして、実行ファイルから見て、EXE生成時に「JVM Selection」→「JRE (it bundled with your application)」で指定した相対パスにJava実行環境のディレクトリが存在しない状態にした場合は、当然ながらアプリケーションは起動しません。必ず、配布する場合や配置場所を変える場合は、実行ファイルとJava実行環境をセットで扱う必要があります。

 以上、まとまりがありませんがこの辺で。早く池袋に買い物に行かなくちゃ!(ぉぃ)

余談その1:SWTについて

 どうやら、32ビット版のJava実行環境しか入っていない環境で、64ビット版のSWTを用いて開発したアプリケーションを動かそうとしても、動かないようだ。

 「Write Once,Run Anywhere」というJavaの基本精神と矛盾しているなぁ。

 おとなしく、開発環境は32ビット版と64ビット版を両方入れておけってことか?

余談その2:64ビット版Eclipse

 私が、自宅環境に64ビット版のEclipseを導入する際に最も参考となった記事。

参考記事
Eclipse3.6 インストール(Win7 64bit) | hrtdotnet.jp

 私が導入したEclipseのバージョンは3.7だが、この記事の内容を適宜読み替えればほぼそのまま通用する。

 なお、ほかの記事だと、「Eclipse」本体側に存在しないフォルダを上書きコピーしろなどと説明されているものが複数ヒットしたが、当然ながらうまく行かなかった…。

余談その3:今回俺様が作成したアプリケーション

 さすがに仕事場で作っているものと同じものを持ってくるわけにも行かないので(そもそも手元にないし)、今回この記事のためと、ウルトラブックPCで実際に使うために作ったサンプルプログラムをご紹介。

 ただし、このプログラムは64ビット版Windows環境で動かすことを大前提としてしまっているため、32ビット環境では動かない。あくまでブログ記事と自分の個人利用のために生成したもののため、ご容赦を!

このブログで関連すると思われる他の投稿:

00

References   [ + ]

1. さすがに自宅からでは可能だとしても試す気にならないし、ましてやブログの記事にするなど内容的にもってのほか
2. 実は私が仕事場で使っている端末でも、つい最近までEclipse同梱のJREしか入っていなかった
3. 私はPNGでしか試していないけど
4. 原文ママ
5. たとえば「C:\Program Files (x86)\Java\jre6\
6. これは必ずEXEを生成するディレクトリと同じ階層に保存すること
この記事はJava, 私的メモに投稿されました タグ: , , , , , , , , , , , . このパーマリンクをブックマークする。 コメントを投稿するか、トラックバックをどうぞ: トラックバック URL.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

* Copy This Password *

* Type Or Paste Password Here *

732スパムコメントは、これまでのところでブロックされたSpam Free Wordpress

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>