1-4: JDKによる開発

JDKによるJavaのプログラム開発の手順を解説します。


・ JDK によるJava言語のアプリケーション開発の手順は、 形式的には C および C++ のそれに似ています。

  1. ソースファイルのエディット
  2. javacコマンドによるコンパイル
  3. 生成されたバイトコードの実行

コンパイル時もしくは実行時にエラーが発生した場合は、 適宜デバッグを行います。
Javaのソースファイルには拡張子 .java を付けます。 また Javaのソースファイルは1つまたは複数のクラス定義で構成されますが、 ソースファイル名はそれらのクラスのうちのどれかと一致していなくてはいけません。 クラス名は習慣として先頭および単語の区切りの先頭をアルファベットの大文字 にします。 したがって WakkanaiHokusei というクラスの定義を記述するためのソースファイルは、 WakkanaiHokusei.javaという名前になります。 バイトコードにはコンパイラによって生成される時に拡張子 .class が付けられます。 バイトコードの実行は、 javaコマンドによって仮想マシンを直接呼び出してバイト・コードを指定するか、 もしくはWebのブラウザのように Javaの仮想マシンを内蔵したアプリケーションによって行われます。
Javaには C や C++ にあるようなプリプロセッサの処理は存在しません。 Javaのバイト・コードは、すべてクラスごとに独立したファイルとして生成されます。 それぞれのモジュールは必要になった時にダイナミックにロードされます。 つまり開発の作業は基本的に、 javac によるコンパイルと、仮想マシンを通じての実行という 2つの段階しかありません。 C や C++ のコンパイルのコマンドが、 プリプロセッサやリンカを呼び出すとは異なります。 プログラマーが覚えるべきことは最小限でよく、 初心者でもすぐ開発に取りかかることができます。 またマシンや OSが異なる環境に移っても開発環境にほとんど違いは生じません。

・ ただし上のような事実から JDKが単純な機能しか提供していないと早合点してはいけません。 コンパイラ javac は 単にバイトコードを生成する機能を提供するだけではありません。 開発のための強力なツールとしての役割も果たします。 javac には、それぞれのクラスのソースファイルの相互依存や 作成された日時をチェックする機能が組み込まれています。 たとえば、 複数のクラスのモジュールからなるアプリケーションを開発しているとしましょう。 そのモジュールのいくつかに変更を加えた場合、 もちろんモジュールの1個1個を順番にコンパイルし直してもよいのですが、 実はもっと簡単な方法があります。 アプリケーションの本体のクラスを javac でコンパイルする作業を1回行うだけでいいのです。 これで目的は達成されます。 アプリケーションのクラスのソース自体には変更がなくても、 javac は自動的に依存するクラスをチェックし、 変更があったものを見つけるとリコンパイルしてくれるからです。 要するに javac は makeコマンドと同じような機能を提供してくれます。 しかも、その際に依存関係を記述したファイル( Makefile の相当するもの) を特に用意する必要もありません。 JDK の開発環境はきわめてシンプルな構成にもかかわらず、 大規模なアプリケーションの開発にも十分耐えうるように設計されているのです。

・ 上の手順を非常に単純なサンプルで確認してみましょう。 ソースファイルの中身は次のようなものです。


/** メッセージを標準出力に表示するクラス */

public class Welcome {

    /** 処理の開始のメソッド */

     static public void main( String argv[] ) {

           System.out.println("Welcome to Wakkanai Web!");
     }
}

クラス名が Welcome なので、 このソースファイルは Welcome.java という名前で用意します。 そして javacコマンドの引数に、そのファイル名を指定してコンパイルします。


javac  Welcome.java

プログラムが文法的に正しければ、コンパイラはバイトコードを生成します。 ここでは Welcome.class という名前になります。 それを仮想マシンに実行させるためには javaコマンドの引数にクラス名を指定します (バイトコード名ではないので注意)。


java  Welcome

これでプログラムが実行されます。 上のプログラムならば、標準出力に "Welcome to Wakkanai Web!" という メッセージが表示されることになります。

・ なお通常のアプリケーションではなく、 Webのページの中で実行されるアプレットの場合には実行の方法が異なります。 それについても触れておきましょう。
HTMLにおけるアプレットの扱いは 基本的にはインライン・イメージの指定に似ています。 アプレットは横幅(WIDTH)と高さ(HEIGHT)が確定した矩形の領域を占めます。 (レイアウトのポリシーや細かい規則はブラウザに依存します。)
HTMLでは、 テキストの中に < と > で囲まれる命令を埋め込んで「タグ」を作りますが、 アプレットをページに「張り付ける」ためのタグは、 たとえば次のようになります。


  <APPLET CODE="Clock.class" WIDTH="200" HEIGHT="40">
  <PARAM NAME="BGCOLOR" VALUE="red">
  <PARAM NAME="FONT" VALUE="LARGE">
  </APPLET>

あるいは、


  <APPLET CODE="Clock.class"
          CODEBASE="http://www.wakhok.ac.jp/~tatsuo/classes"
          WIDTH="300" HEIGHT="60">
  </APPLET>

<APPLET> がアプレットであることを示す命令です。 これに始まって </APPLET> で終わるまでの範囲が、 アプレットの情報の記述に用いられます。 (最近の HTMLのバージョンでは APPLET に代わって、 より一般的な OBJECT タグの使用が推奨されています。 将来的にはこちらに統一されるでしょう。)
<APPLET> の中には、CODE="" によるバイトコードの指定が必須です。 バイトコード名は拡張子 .class も省略できません。 アプレットのバイトコードが JAR形式のアーカイブファイルにまとめられて いる場合には ARCHIVE="" によってそのファイル名を指定します。
バイトコードが置かれているディレクトリは、CODEBASE="" によって 指定することができます。 URL の絶対名もしくは、HTML のドキュメントが置かれた ディレクトリからの相対パス名で指定してください。 この指定によって他の人が開発したアプレットを自分のページに利用したり、 自作のアプレットのコードを特定のディレクトリに集めて管理する ことが可能になります。
バイトコードの存在するディレクトリがクラスパスの中に設定されている場合、 たとえば HTML のドキュメントとバイトコードが存在するディレクトリが同じ場合は、 CODEBASE="" を特に指定する必要はありません。
アプレットのサイズは プログラム自身が動的に変化することもあり得ます。 しかし、それに対してブラウザがどう対応するかはブラウザに依存します。 したがって最初から領域のサイズをきちんと確保しておくために <APPLET> 内の WIDTH および HEIGHT の指定が現行では必須です。 (アプレットのプログラム内で実行されるサイズ指定とは独立です。)
以上のような全てのアプレットに共通する情報は、<APPLET> の タグの中で指定します。 これに対してアプレットに固有のパラメータの設定は、 <PARAM> のタグによって行います。 1つのパラメータに対して1つの <PARAM> を用い、 NAME="" と VALUE="" という形式でパラメータ名およびその値のペアを 指定します。パラメータ名はもちろん文字列ですが、 その値もすべて文字列のデータのままアプレットに渡されます。 どんなパラメータが利用できて、どんな意味を持つのかは、 アプレットのプログラムによってルールが決められます。
アプレットを実行するためには、それ含む HTMLファイルの URLをブラウザに 指定します(あるいはあらかじめ作成されたリンクをたどります)。 JDKに付属の appletviewer を用いてアプレットの動作を確認するためには、 引数としてアプレットを含む HTMLファイルの URL(相対指定も可)を与えます。 指定するのはアプレットのバイトコードではない点に注意してください。