<歴史>
Javaの文法やら何やらの話に入る前に、まず「Javaとは何ぞや?」の話から始めましょう。
Javaとは、1991年にSun Microsystems社で開発されたプログラミング言語です。C言語のような
構造化プログラミング言語とは異なり、SmallTalkやC++などと同様にオブジェクト指向プログラミング言語
に属します。
今ではJavaといえばインターネット時代の申し子という感じですが、元々は家電用の開発言語となるべく
生まれてきたのです。製品・基盤に依存することなく実行可能なソフトウェア、一度作ればどこでも実行できる
(write once, run anywhere)という考えを元に開発されました。
このJavaのプラットフォームに依存しないという性質は、家電の世界ではなくインターネットの世界で
より多くの注目を集めました。
インターネット上に接続されているコンピュータのハードウェア構成は様々であり、
OSだけでもWindows、Unix、Linux、Mac OSと複数存在します。ソフトウェアとは通常CPU依存・OS依存であり、
あるプラットフォーム上で動作するソフトウェアは異なるプラットフォーム上で動作させることは出来ません。
そんな中write once, run anywhereを実現したJavaに注目が集まるのは当然といえるでしょう。
今日においても最も注目されている言語の一つです。
<プラットフォーム非依存>
C言語で記述されたソースコードはコンパイルすることで、CPUが解釈・実行可能なオブジェクトコードへ変換されます。
しかし、このオブジェクトコードはプラットフォーム依存です。つまりWindows用コンパイラでコンパイルされ生成された
オブジェクトコードはWindows上でしか実行できません。Unix上で実行したければUnix用のコンパイラが別途必要と
なります。
これだけだと、なーんだコンパイラを個々のプラットフォーム向けに用意すればいいだけか、と思われるかもしれませんが
プラットフォームが異なると、ソースコードも個々のプラットフォーム向けに修正せねばなりません。
プラットフォーム間の移植とは結構コストが掛かるものなのです。
しかしJavaならばこのような問題は起こりません。一体どのような仕組みでプラットフォーム非依存を実現している
のでしょうか?
Javaの場合、ソースコードをコンパイルすることによって生成されるのはバイトコードと呼ばれるものになります。
バイトコードは特定のプラットフォームに依存しません。つまりWindowsにもUnixにもMacにも依存しないのです。
言い方を変えましょう、JavaのバイトコードはWindowsマシンのCPUにっとて訳の分からんコードであり、
UnixマシンのCPUにとっても宇宙人の言葉であり、MacのCPUからみても子供の落書き以上に意味不明なコードだという
ことです。
おぃおぃ、どのマシンも解釈・実行不可能なコードを作ってどーする!と怒られそうですが、実はこのバイトコードは
Java Virtual Machine(Java VM、JVM)には理解できる形になっているのです。
Java VMはバイトコードを解釈・実行可能なソフトウェアであると思ってください。そして、このJava VMは
Sun Microsystems社によりWindows用、Unix用、Mac用とそれぞれのプラットフォーム向けに無償で用意されています。
ネット上で何時でも最新版のダウンロードが可能です。
このJava VMの存在によりプラットフォーム非依存が実現できているわけです。
単にJavaと言った場合2つの側面があります。1つがプログラミング言語であるJava言語としての側面、
もう1つが実行環境であるJava VMとしての側面です。会話や書籍の中でJavaという言葉が登場した場合、
どっちの意味で使っているのかは文脈から判断しましょう。
JDKをインストールしましょう。2008年11月時点での最新版はJDK 6になります。本講座で扱う内容は
JDK5.0以降の内容になりますので、5.0以前の方は最新版をインストールしましょう。
ちなみにインストール環境はWindowsXPってことで。
Java SE Downloads
サイトに飛んだら「JDK 6 Update 10」のダウンロードをクリック。後はインストーラの指示に従って
「次へ」を押しまくりでインストール完了です!
インストールが出来たら次にパスを通しましょう。
「マイコンピュータ」右クリック→「プロパティ」→「詳細設定タブ」→「環境変数」
そしたら、Pathの先頭に「C:\Program Files\Java\jdk1.6.0_06\bin;」を追加。
(jdk1.6.0_06の部分はUpdate 10だと違うかもしれんので、各自調べること。私の多分古い・・・)
Windowsを再起動したら完了です。さあ、いよいよ講座の開始です!
テキストエディタでコードがりがり書いて、コマンドプロンプトでコンパイルしてくよ!
えっ?Eclipse?何それ?おいしいの?
まずはコマンドプロンプト上に文字列を表示するプログラムを作成しましょう。
表示する文字列はもちろん「Hello World!」。思えば・・・私がプログラム初心者の時は画面上にこの
Hello World!が表示されただけで「おーー!!!」と感動したものですが、最近の奴らときたらブツブツブツブツブツ
・・・歳かな?
プログラムを記述する前に、事前準備としてCドライブ直下にmyjavaというフォルダを作ってください。
作成したソースコードはこのフォルダ内に格納するようにしてください。フォルダ名は別に何でもいいですよ。
あとファイルが増加してくると単一フォルダでは整理しきれんのでmyjava直下にサブフォルダを作成
してください。
それではテキストエディタを起動して以下のコードを入力してください。テキストエディタはメモ帳でも
問題ありませんが、Terapadや秀丸などの高機能エディタをお勧めします。
public class MyClass
{
public static void main(String args[])
{
System.out.println("Hello World!");
}
}
Javaでは大文字と小文字が区別されるので注意してください。publicをPublicなどと入力するとコンパイルエラー
になります。
またファイル名はクラス名と一致させなければなりません。
この例の場合”MyClass.java”というファイル名にする必要があります。
ではMyClass.javaファイルをmyjavaフォルダに格納しましたら、コマンドプロンプトを立ち上げて
CDコマンドで作業ディレクトリを指定します。以下のように入力してください。
cd C:\myjava
例えば私の場合、以下のようにカレントディレクトリが変更されます。
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\taichi>cd C:\myjava
C:\myjava>
次にMyClass.javaをコンパイルしましょう。コンパイルにはjavacコマンドを使用します。
C:\Documents and Settings\taichi>cd C:\myjava
C:\myjava>javac MyClass.java
C:\myjava>
コンパイルが成功した場合特に何も表示されませんので、本当に上手くいったのか不安になりますが
(;・∀・)ダ・・・ダイジョウブなはずです。念のためdirコマンドで確認しておきましょう。
C:\myjava>javac MyClass.java
C:\myjava>dir
C:\myjava のディレクトリ
2008/11/29 20:44 <DIR> .
2008/11/29 20:44 <DIR> ..
2008/11/29 20:44 420 MyClass.class
2008/11/29 20:37 133 MyClass.java
2 個のファイル 553 バイト
2 個のディレクトリ 274,392,403,968 バイトの空き領域
C:\myjava>
MyClass.classが作成されていればOKです。実はこのMyClass.classはクラスファイルと呼ばれるもので、
こいつこそがバイトコードを格納しているファイルなのです。後はJava VM上でこのバイトコードを解釈・実行
するだけです。ラストです。javaコマンドを実行しましょう。
C:\myjava>java MyClass
Hello World!
C:\myjava>
Hello World!と表示されましたでしょうか。(;∀;) カンドーですね。
今回の講座は以上です。おつかれさまでした!ではー。
グラフィックの基礎として"直線"と"四角形"と"円"の表示方法を覚えましょう。
まずはプログラムを見てみましょう。
import java.applet.Applet;
import java.awt.Graphics;
public class MyClass extends Applet
{
public void paint(Graphics g)
{
g.drawLine(100,50,200,50);
g.drawRect(100,100,100,50);
g.drawOval(100,150,100,50);
}
}
C言語でWindowsプログラミングをすると直線一本書くのにも難儀しますが、Javaの場合非常に楽チンですね。あまり語ることがないですが、メソッドをちょっと解説しときます。
まず、まず直線を引くメソッドはg.drawLine(x1, y1, x2, y2)です。
ちなみにメソッドというのはC言語でいうところの関数みたいなものだと思ってください。このメソッドを使って座標(x1, y1)から(x2, y2)まで線を引くことができます。
四角形を描くメソッドはg.drawRect(x, y, width, height)です。
(x, y)を基準として、幅width、高さheightの四角形を描画します。
※基準(x, y)は四角形の左上隅になります。
円を描くメソッドはg.drawOval(x, y, width, height)です。
四角形を描くメソッドと引数が同じですが、g.drawOvalの場合、四角形に対する内接円を描画することになります。
コンストラクタとはオブジェクトの初期化を行うためのメソッドのことです。
コンストラクタの名前は、C++同様にクラス名と同じにする必要があります。
C++ではオブジェクトを破棄するさいにデストラクタを呼び出して確保されたリソースを解放する必要がありました。
しかしJavaでは「ガーベッジコレクション」という”ごみ収集屋”さん的な概念がサポートされているため、
デストラクタなしでリソースの解放が自動的に行われます。
class MyProg
{
public static void main(String args[])
{
System.out.println("Hello World!");
}
}
class MyClass
{
public void func1()
{
}
MyClass()
{
//コンストラクタの中身
}
}
インターフェースは抽象クラスの一種です。各クラスに対し、共通でつかうメソッドのプロトタイプを伝える役割をします。
JavaにはC++にみられるような「多重継承」という概念はサポートされていません。つまり、子クラスが複数の親クラスを
持つことは許されていないのです。しかし、プログラミングをする上では多重継承的な考えが必要になるのものなのです。
そこでJavaは「多重継承」に変わるものとして「インターフェース」という概念を導入したのです。
class MyProg
{
public static void main(String args[])
{
//なんたらかんたら
}
}
interface myface
{
//ここにメソッドのプロトタイプ
}
class face1 implements myface
{
}
class face2 implements myface
{
}
マルチスレッドの話に入る前に、ちょっとオペレーティング・システム(OS)についての話をしましょう。
今日、OSの世界でシェアを奪いまくっているのはWindowsですが、そのWindows登場以前はMS-DOSと呼ばれるOSが
世の中に出回ってました。MS-DOSの時代は、どのソフトを使いたいかでどのメーカーのパソコンを買うかが決まって
いました。と言いますのも、NECのパソコン上で動くソフトフェアが富士通やIBMのパソコン上では動作できなかった
ためです。それがWindows登場のおかげで、OSがWindowsでさえあれば、SONYだろうが、富士通だろうがメーカーに
関係なくソフトウェアを動作させることが可能となったのです。
私が小学生の時に家にあったパソコンはNEC製のPC-9801VMでした。この時代はNEC製パソコンに対応した
ソフトウェアが多く出回っていたので、まさにNECの天下だったのですが、Windows登場以降はDOS/V機の売り上げが
急加速しパソコンの業界図が激変したのでした。
Windowsはマシン間のソフトウェア互換性の問題を解決してくれたという特徴以外にも、GUI環境(グラフィカル・
ユーザー・インターフェイス)、マルチタスクという大きな特徴を持っていました。
旧来のMS-DOSは、CUI環境(キャラクター・ユーザー・インターフェイス)にシングルタスクでした。
実はCUIについては現在のWindowsでもコマンドプロンプトという形で残っているのですが、MS-DOS時代には
プログラム起動やファイル管理などあらゆる処理を真っ黒い画面上で文字(キャラクター)入力によって
行わなければなりませんでした。これをCUIと言います。それに対しWindowsではプログラムの起動なんて
アイコンをダブルクリックすればOKだし、ファイルの作成・削除もグラフィカルに操作可能ですね。これが
GUIです。今日におけるパソコンの急激な普及はこのGUI環境によるものだと言っても過言ではありません。
さて余談はこれくらいにして、マルチスレッドに関わる本題に入りましょう
Windowsでは、複数のアプリケーションを同時に起動することができますね。例えばMedia Playerでムービーを再生しながら
Webブラウザを開いてネットサーフィンして、新作ネトゲーの実行ファイルをダウンロードしつつ、3Dソフトでレンダリング
処理を行うことが可能なのです。この複数のアプリケーションを同時に実行できるOSの仕組みをマルチタスクと呼びます。
(タスクというのは仕事のことで、この場合アプリケーションの実行処理を指す言葉と解釈してください)
MS-DOSはシングルタスクのOSですので、複数のアプリケーションを同時実行することがそもそも出来なかった
のです。例えば文章作成ソフトを起動している最中に、お絵描きソフトを起動することは出来ないのです。
ところで、アプリケーションの実体はいうまでもなくプログラムです。そのプログラムを解釈・実行するのは
OSが何であろうが結局のところ中央処理演算装置(CPU)なわけです。ではOSがマルチタスクをサポートする
Windowsになったことにより、パソコンも複数のCPUを搭載したのでしょうか?答えは否です。
(デュアルCPUやクアッドコア等の技術については頭の隅に追いやってくださいませ)
CPUというのは、基本的に複数の処理を同時実行できる仕組みにはなっていません。処理Aが終了したら
処理Bを実行し、それが終了して初めて処理Cが実行できるのです。つまり、処理Aと処理B、処理Cを同時実行する
ことなどCPUの機構上不可能なのです。
あれっ?じゃあ、どうやってマルチタスクを実現しているの?という話になりますが、実はあるトリックを使うことで
実現しています。本当は同時実行してるわけじゃないんだけど、同時実行してるように見せかけちゃうトリックです。
個々のアプリケーションが実行すべき処理をこま切れにして、CPUが長短時間でそのこま切れ処理を切り替えながら
実行していけば、見かけ上同時実行されてるっぽく見えるってことです。
(右のCPUに向かって、各アプリケーションの処理が流れていっている図)

上図の場合、アプリケーション1〜3の各処理をCPUが次々に実行することにより並列処理を実現しています。
CPUから見れば、「アプリ1の処理1」が終わったあとに「アプリ2の処理1」を実行し・・・というように
1つずつ順々に命令を実行しているだけですが、我々人間から見るとCPUの処理速度はあまりに速すぎるため
アプリ1〜3までが同時実行しているように見えてしまうのです。
ほらっ忍術で、「素早い動きによる残像により、あたかも複数人が同時に存在しているように見える」っていうの
あるじゃないですか!あれです、あれっ!まさにアレ!
以上マルチタスクの解説でした。
「おいっ!マルチスレッドの話は何時になったら始まるんだ」とお叱りを受けそうですが、実はマルチタスクの話
が終わった時点で、マルチスレッドの話の大半も終わったようなものなのです。
マルチタスクが「OS内の各アプリケーションを並列実行する」機構であるのに対し、マルチスレッドは
「アプリケーション内の各処理を並列実行する」機構です。そしてあたかも同時実行されてるように見える処理の流れ、
一本一本の線のことをスレッドと呼びます。Threadとは、本来「線」とか「糸」という意味なのです。
(マルチスレッドはこんなイメージな図)

ほぼマルチタスクのときと同じですね。とはいえ、「マルチタスクは分かるけどマルチスレッドはどんなケースで
利用されるのかイメージできん」という方もおられるでしょう。なので代表例をば。
RPGやシューティングなどのゲームで、フィールドが変わったりステージが変わったりするときにNow Loadingと
画面上に表示されることがありませんか?で、しかもそのNow Loadingのイメージが様々なアニメーションを
見せるのです。例えば点滅したり、動いたり、光ったりなどです。
ここにマルチスレッドの技術が生かされています。実はこれ、次のフィールド・ステージデータを読み込むための
「ローディング用スレッド」と「Now Loading表示用スレッド」の2本が同時に実行されているのです。
シングルスレッドであればローディング処理が行われている最中にリアルタイムでNow Loadingのアニメーションは
出来ません。ですから、ローディング処理に入る直前にNow Loading用の画像なりを画面に表示して、その静止画を
表示している最中にローディングをさっさと終わらせなければなりません。ですが単なる静止画ですとプレイヤーは
退屈してしまします。
例えば、バイオハザード。あれはNow Loading部分を上手く誤魔化している良い例です。エリア移動の際に次のエリアデータ
の読み込みが発生しますが、そのローディングの最中Now Loadingと表示するのではなく、扉を開くアニメーションを
表示しますよね。あの工夫により、シームレスにゲームが展開しているようにプレイヤーは錯覚し、ロード時間の
ストレスを感じなくてすむ訳です。もっとも最近では、ハードの高性能化により完全なシームレスを
実現しているものも多いです。
なんにしても、このようなことが出来るのはマルチスレッドのおかげなのです。
ちなみにJavaでは、大きく分けてメインスレッドとガーベッジコレクションスレッドの
2つが多重に処理されています。これはJavaの機構が内部的に行っている処理ですので、プログラマがどうこうする
話ではないのですが、我々がJavaにふれたその時から実はマルチスレッドとは無関係ではなかったという
ことなのです。どうです、マルチスレッドを身近に感じてきましたか?
同期・排他制御、各スレッドのCPUを時間配分等、理解していかねばならないことは少なくありませんが、
頑張って理解していきましょう。次回から具体的にコードをみていきましょう。では〜
前回はマルチスレッドの概要についてお話しましたが、今回は具体的にスレッドを作成して
マルチスレッドプログラムの第一歩を踏み出してみましょう。
スレッドとは、アプリケーション(プロセス)内での各々の処理の流れのことです。
これから作るプログラムは「悲しい顔文字を10回表示する」という処理の流れと「嬉しい顔文字を10回表示する」という処理の流れを
それぞれスレッド1・スレッド2と名付け、マルチスレッド環境下での実行を試みるものです。
早速作成に入りますが、タイトルにもあるように「スレッドには2通りの作成方法」が存在します。
1つが「Threadクラスを拡張する方法」、もう1つが「Runnableインターフェイスを実装する方法」です。
それでは以下に、2通りのソースコードと実行結果を示します。
★★★Threadクラスを拡張する方法★★★(ThreadSample1.java)
class SadExpression extends Thread{
public void run(){
for(int i=0; i<10; i++){
System.out.println(i + "(ノД`)");
}
}
}
class HappyExpression extends Thread{
public void run(){
for(int i=0; i<10; i++){
System.out.println(i + "(´▽`*)");
}
}
}
class ThreadSample1{
public static void main(String[] args){
SadExpression thread1 = new SadExpression();
HappyExpression thread2 = new HappyExpression();
thread1.start();
thread2.start();
}
}
Threadクラスを拡張したSadExpressionクラスとHappyExpressionクラスを作成しました。
これらのクラス内ではrun()メソッドをオーバーライドする必要があり、run()メソッド内に
目的とする処理を記述します。
そのrun()メソッド自身は、start()メソッドにより呼ばれる仕組みになっています。
★★★Runnableインターフェイスを実装する方法★★★(ThreadSample2.java)
class SadExpression implements Runnable{
public void run(){
for(int i=0; i<10; i++){
System.out.println(i + "(ノД`)");
}
}
}
class HappyExpression implements Runnable{
public void run(){
for(int i=0; i<10; i++){
System.out.println(i + "(´▽`*)");
}
}
}
class ThreadSample2{
public static void main(String[] args){
SadExpression sad = new SadExpression();
HappyExpression happy = new HappyExpression();
Thread thread1 = new Thread(sad);
Thread thread2 = new Thread(happy);
thread1.start();
thread2.start();
}
}
先ほどのコードとあまり違いはありませんが、「extends Thread」が「implements Runnable」に
変わったところと、main()メソッド内でThreadクラスのインスタンスを作成しているところが
異なります。
♪♪♪どちらでも結果はこんな感じ♪♪♪
0(ノД`)
0(´▽`*)
1(ノД`)
1(´▽`*)
2(ノД`)
2(´▽`*)
3(ノД`)
4(ノД`)
5(ノД`)
6(ノД`)
7(ノД`)
8(ノД`)
9(ノД`)
3(´▽`*)
4(´▽`*)
5(´▽`*)
6(´▽`*)
7(´▽`*)
8(´▽`*)
9(´▽`*)
どちらの作成方法でも、実行結果は同じです。実行の度に表示結果は異なりますが気にしなーい。
重要なことは、SadExpressionクラスの処理内容とHappyExpressionの処理内容が並行して実行されている
というこです。これこそがマルチスレッドプログラミングと呼ばれるものです。
ところで、2通りのスレッドの実装方法を示しましたが、処理結果が同じなら最初のThreadクラスを拡張する
方法だけでいいんじゃね〜?って気分になってきますが、最初の方法だけでは対応できないケースがあるのです。
それはJavaが多重継承をサポートしていないことに関係します。
Threadクラスを拡張する方法は確かに手軽でよいのですが、例えばSadExpressionクラスが実は既にEmotionクラスの
サブクラスであった場合はどうです?
Javaにおいて多重継承がサポートされていないということは、スーパークラスを複数持つことは不可能である
ことを意味します。つまり以下のような記述はできないということなのです。
class SadExpression extends Emotion extends Thread{ ←ダメ!
class SadExpression extends Emotion, Thread{ ←無駄無駄!
しかし、Runnableインターフェイスを実装ならば問題ありません。インターフェイスは複数持つことが
可能ですし、クラス拡張との混在・同時表記が可能です。例えばこんな感じ。
class SadExpression implements Emotion, Runnable{ ←Emotionもインターフェイスだった場合ね!
class SadExpression extends Emotion implements Runnable{ ←問題なし!
以上より、継承の問題が発生するか否かで2通りの方法を使い分ければ宜しいと思います。
では今回の話はここまで。次回はいよいよスレッドプログラムにおける重要ポイント「同期」について
くどくど話していきたいと思います。では〜(´▽`)ノシ
私 「今日はファイル操作についてお話しますよ〜」
生徒 「ファイル操作っていうと、テキストファイルを作成したりすることですよね!」
私 「おう!まさにその通り!分かってるじゃん、さすが我が生徒(´▽`*)」
生徒 「あっそれなら右クリックしてポップアップの新規作成のところをクリッ・・・」
私 「ぶらぁぁぁぁぁぁ!!!(ノ ゚Д゚)ノ ==== ┻━━┻」
ということで、今回はJavaからファイルの読み書きをするプログラムを作成します。
これより2つのプログラムを作成します。一方は「適当な文字列が入力されたmyfile.txtを新規作成するプログラム」、
もう一方は「そのmyfile.txtの内容を表示するプログラム」です。
まずは新規作成の方から。
★★★ファイルへの書き込み★★★(MyFileWriter.java)
import java.io.*;
class MyFileWriter{
public static void main(String args[]){
try{
FileWriter fw = new FileWriter("myfile.txt");
fw.write("Java最高!\r\n");
fw.write("プログラミング最高!\r\n");
fw.write("ビールもうめぇ\r\n");
fw.close();
}catch(Exception e){
System.out.println(e);
}
}
}
ファイルへの書き込みを行うにはFileWriterオブジェクトが必要となります。で、FileWriterクラスは
java.ioパッケージにより提供されるので、最初にこれをインポート(import)する必要があります。
作成したいファイル名はFileWriterコンストラクタの引数に渡してやればOKです。作成したファイルに
文字列を書き込んでいくのはwriterメソッドです。改行コードはOS依存(文字コード依存)になるので、
そのOSに合わせたものを指定してください。Windowsの場合は\r\n(CR+LF)です。
(※ちなみに、Unixは\n、Macは\rとなります)
プログラム実行すると、カレントディレクトリにmyfile.txtが作成されるはずなので、取りあえず上手く
いったかメモ帳か何かで確認しといてくれ!
それでは次に、その作成されたmyfile.txtの内容をコマンドプロンプト上に表示するプログラムを作成
しましょう。
★★★ファイルからの読み込み★★★(MyFileReader.java)
import java.io.*;
class MyFileReader{
public static void main(String[] args){
try {
FileReader fr = new FileReader("myfile.txt");
int i;
while( (i=fr.read()) != -1 ){
System.out.print((char)i);
}
fr.close();
}catch(Exception e){
System.out.println(e);
}
}
}
まず前提知識として、Javaのchar型は16バイト!8バイトじゃないよ!
(JavaはUnicode環境なためだけど、こういう話はまた別の機会にでも・・・)
read()メソッドで一文字一文字読み込んでる訳ですが、なんと戻り値はint型( ̄□ ̄;)。
一文字当たり16バイトで読み込んで、それがint型32bit変数の下位16bitに格納されるわけです。
なので、表示の際にはchar型でキャストして上位16bitをぶっ飛ばしっと・・・。
・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・
・・・
なんかヤじゃね?この仕様( ;´Д`)
では今回はここまで。次回はバッファリングについて解説しようかな。
そもそもEXEファイル化したいアプリケーションならJavaではなくVBやC++の方が良いと思いますが、
Javaでスタンドアローンで動作するアプリが作りたい!しかもアイコンダブルクリックで起動したい!という要望も
あると思うので簡単にご紹介。
スタンドアローンで動かすだけならJARファイルでも十分なのですが、あれってアイコン変えられないわ
拡張子の関連付けがなってないと上手くうごかねーわで結構( ゚Д゚)マンドクセーなわけですよ。それに開発者の立場からすると
JARファイルはリバースエンジニアリングが容易なのでソースコードばれちゃってイヤ〜な気分になったりするのです。
そのため、EXEでラップして隠せるものなら隠したいと考えている人もいるのでは?
さて、結論から申しますと、そもそもJavaはEXEファイルを作成する仕組みをもっておりません。そのため、EXE化したい場合、
「JavaコードからWin32ネイティブコードに変換するツール」や「JavaアプリケーションをEXEファイルにラッピングするツール」が必要となるわけです。
前者のツールではJavaVMすら必要としなくなりますが、有償(金が掛かる)のものしかありません。よって、無償・フリーで
利用できるJSmoothやexewrapを紹介します。
解説するのも( ゚Д゚)マンドクセーので解説してくれているサイトへのリンク貼っときます。
JSmooth(sourceforge.net) JSmoothのダウンロードはこのサイトから
exewrap(exewrapの作者さんのサイト)
Javaをexeファイルに変更(JSmoothの解説ページ)
単にJARファイルの起動をEXE経由で行えればいいってだけなら、以下のサイトのように自分でちゃちゃっと作ってしまうのも
いいかもしんないよ。
JavaアプリをWinアプリから実行
以上です。今回は番外編的な内容でしたね。
|