Solaris2.6へのJAVA2導入 Last update 1999.10.25

 この文書は「データ通信実習」という実習のレポートをHTML化したものです。内容はタイトルの通りSolaris2.6にJAVA2(JDK1.2)を導入するというものです。


INDEX

  1. What's JAVA
  2. JDK1.2 is JAVA2 SDK
  3. Getting Files
  4. Prepare for Install
  5. JDK1.2 Install
  6. Setting
  7. Using JAVA

1. What's JAVA


 JAVAはSunMicrosystems社が開発したオブジェクト指向のプログラミング言語、およびその実行環境です。もともとは電気機器向けに開発されていた言語でC++の影響を色濃く受けています。

 JAVAでは全てのプログラムがクラスの集合として書かれます。Objectというクラスが中心にあり、それを継承する形で様々なクラスが定義されています。クラスの種類は豊富で、一般的なプログラムに必要な要素のほとんどがそろっています。
 JAVAの大きな特徴として3つの点があげられます。

    1. 完全なObject指向である
    2. 環境を選ばない
    3. ネットワークとの親和性が高い

 1の完全なObject指向というのはコードのすべてがクラスのメソッドとして書かれるからです。すべての機能は必要な変数と命令を含むクラスの形で提供されます。プログラマはそれらを継承することで新しいクラスを作ることもできます。

 2の環境を選ばないというのは実行環境のことです。JavaVM(Java Virtual Machine)と呼ばれる仮想のマシン上で実行されます。これによってJavaVMを実装した環境であればどのようなOS・プロセッサ上でも実行が可能です。コンパイルをし直す必要もありません。JavaVMを実装した携帯電話やPDAもすでに発表されています。

 3のネットワークとの親和性が高い、には2つの意味があります。第1にJavaでは機能の大部分をクラスという形で実現するためにプログラムがコンパクトになるということ、第2にネットワークを簡単に扱えるクラスが用意されているということです。


2. JDK1.2 is JAVA2


 SunMicrosystems社が開発したJAVAには複数のバージョンが存在します。

    JDK 1.0.x
    JDK 1.1.x
    JDK 1.2 .x

 ここで出てきたJDKというのは純正の(サン・マイクロシステムズが提供する)JAVA開発環境です。JAVAプログラムを実行するためのソフトと、ソースコードをコンパイルするためのソフトなどが含まれます。

 JDK 1.0は最も初期のJAVAで、現在の仕様とは異なる部分が多くあります。機能の実相も不十分なほか、現在と細かいところが異なるので注意が必要です。

 JDK 1.1は現在最もポピュラーなバージョンで、純正のものだけではなく、他のベンダからも提供されています。JAVAの仕組みの多くはこのバージョンで正式に決まったもので、実行可能な環境も多いのが特徴です。最終バージョンは1.1.8です。

 JDK 1.2は一般公開されている中では最も新しいバージョンで、Swingと呼ばれるGUIのクラスなどはこのバージョンから正式に含まれるようになりました。機能的にも充実していますが、普及度が低いのと、高機能ゆえに遅くなってしまったのが残念です。最新バージョンは1.2.2です。SunMicrosystemsではこのJDK 1.2に相当する環境をJAVA2呼ぶようになりました。このため、JDK 1.2のことをJAVA2 SDKと呼ぶこともあります。

 このほかにIBMが開発したJikesやAppleComputerが開発したMRJ SDKなどがあります。SunMicrosystemsもJDKから開発環境を取り除き、実行環境だけにしたJREやJDKの最新バージョンとなる1.3などを開発しています。

3. Getting Files


 必要なファイルを手に入れます。下の2つのファイルを手に入れてください。これらのファイルは現時点(99.10.12)での最新バージョンです。

   2_6_x86_Recommended_tar.gz(約15MB)
   Solaris_JDK_1.2.1_03_ja_i386.bin (約18MB)

 これらのファイルは以下のURLからダウンロードできます。

   http://sunsolve.sun.co.jp/pub-cgi/show.pl?target=patches/patch-access
   http://java.sun.com/


4. Prepare for Install


 インストールの前準備を行います。JDK 1.2のインストールの前にSolarisにパッチを当てます。当てるパッチは「Recommended Patch(推奨パッチ)」と呼ばれるもので、OSのバグを修正したり、パフォーマンスを上げることができます。

 今回は先ほど手に入れた2_6_x86_Recommended_tar.gzを使用します。

 パッチを解凍します。GNUtarがあると楽です。ここではGNUtarがあるという前提で話を進めます。

% tar -zxvf 2_6_x86_Recommended_tar.gz

 新しくできたディレクトリに移動してください。中にあるREADMEに目を通しておいた方がいいです。

 コンソールにルートでログインし直し、実行モードをシングルユーザモードににします。間違ってもX-Windowや他のユーザが使用しているような状況ではパッチを当てることはできません。

% su
# init 1

 ./install_clusterを実行します。警告やディスクの容量チェックを経てインストールが
始まりますが、それほど気にしなくても大丈夫そうです。作業はrootユーザで行ってください。

# ./install_cluster

 作業には時間がかかります。インストールのログは/var/sadm/install_data/<cluster name>_logに残ります。

 パッチ当てが終わったら再起動します。

# shutdown -y -i0 -g0

 きちんと動作していればパッチ当ては成功です。次はいよいよJDKのインストールです。



5. JDK 1.2 Install


 JDK 1.2をインストールします。先ほど手に入れたSolaris_JDK_1.2.1_03_ja_i386.binをJDKをインストールしたいディレクトリに移動してください。

 ファイルのあるディレクトリに移動し、バイナリを実行します。直接実行せずに、shの引数として指定してください。

% sh Solaris_JDK_1.2.1_03_ja_i386.bin

 解凍が始まり、やがてSolaris_JDK_1.2.1_03という名前のディレクトリが現れます。このディレクトリ必要なファイルが収められています。そのままの名前では使いにくいので名前を変更します。(変更する名前は自由です)

% mv Solaris_JDK_1.2.1_03 java2



6. Setting


 インストールしたJDK 1.2をデフォルトに設定します。Solaris2.6のデフォルトは1.1です。作業はルートで行ってください。

# /usr/bin/mv /usr/java /usr/java.oldlink
# /usr/bin/ln -s /usr/java1.2 /usr/java (java2が/usr直下にあると仮定)

 -versionオプションをつけてバージョンを調べてみます。

% java -version
java version "1.2.1"
Solaris VM (build Solaris_JDK_1.2.1_03, native threads, sunwjit)

 もし古いJDKに戻したいときはsuして以下のコマンドを入力してください。

# /usr/bin/mv /usr/java.oldlink /usr/java

 MANPATHの設定を加えてマニュアルが表示されるようにします。(cshの場合は.cshrcに書き加えてください)

Setenv MANPATH /opt/src/java2/man:$MANPATH

 とりあえずデモンストレーション用のアプリを実行してみます。

% cd /usr/java2/demo/jfc/Metalworks
% java Metalworks

 フォント関係のエラーが出るかもしれませんが、しばらく待っているとウィンドウが
表示されます。メニューからいろいろ選んでみてください。



7. Using JAVA


 実際にJAVAでプログラムを組み、実行してみます。適当なディレクトリを作成し、viで付録1と付録2のソースを入力してください。

※ プログラム中のIPアドレスは各自の環境に合わせて変更して下さい。

 入力が終わったらコンパイルします。

% javac receive.java
% javac send.java

 無事コンパイルできたら。ファイルの一覧を見てみてください。

% ls
receive.class receive.java send.class send.java

 「1.What's JAVA」でも書いたようにJAVAアプリケーションはクラスの集合として書きます。この場合、receive.classとsend.classがアプリケーションです。

 実行するにはjavaの引数に.classを除いたクラスの名前を指定します。

% java receive
Welcome to receive & send

 別のマシンでsendを実行してください。

% java send
Welcome to receive & send
>

 カーソルが表示されたら文字を入力し、改行します。

>Hello,World

 receiveを実行しているマシンの画面を見てください。sendに書き込んだ文字列が現れるはずです。慌てて作ったものなので末尾にゴミがついたり、途中で途切れますが気にしないでください。

付録1   受信用アプリケーションのソースコード

// receive.java

import java.net.*;
import java.io.*;

class receive
{
	public static void main( String[] args )
	{
		try{
			byte            baf[] = new byte[1024];

			DatagramSocket  sock = new DatagramSocket(6666);
			DatagramPacket  pack = new DatagramPacket(baf,1000);
			String          message;
			boolean         flag = true;

			System.out.println( "Welcome to send & receive" );

			while( flag )
			{
				sock.receive( pack );
				message = new String( pack.getData() );
				System.out.println( message );
			}

			sock.close();
			System.out.println( "See you again!" );
		}
		catch( SocketException e)
		{
			System.out.println("Socket Error has occured.");
			System.exit(0);
		}
		catch( IOException e)
		{
			System.out.println("I/O Error has occured.");
			System.exit(0);
		}
	}
}

 このプログラムは終了する機能を加えていません。Ctrl+Cで強制終了してください。


付録2    送信用アプリケーションのソースコード

// test java

import java.net.*;
import java.io.*;

class send
{
	public static void main( String[] args )
	{
		try{
			byte            baf[] = new byte[1024];

			DatagramSocket  sock  = new
			DatagramSocket(6666,InetAddress.getByName("192.168.3.255"));

			BufferedReader  keyboard  =  new
			BufferedReader( new InputStreamReader(System.in));
			DatagramPacket  pack = new DatagramPacket(baf,1000);

			String  message;
			Boolean  flag = true;

			System.out.println( "Welcome to send & receive" );
			pack.setPort(6666);
			pack.setAddress( InetAddress.getByName( "192.168.3.255" ) );

			while( flag )
			{
				System.out.print( "> " );
				message =keyboard .readLine();
				if( message.equals( "end" ) )
				{
					flag = false;
				}
				else
				{
					pack.setData( message.getBytes() );
					sock.send( pack );
				}
			}

			sock.close();
			keyboard.close();
			System.out.println( "See you again!" );

			System.exit( 0 );
		}
		catch( SocketException e)
		{
			System.out.println("Socket Error has occured.");
			System.exit(0);
		}
		catch( IOException e)
		{
			System.out.println("I/O Error has occured.");
			System.exit(0);
		}
	}
}

 このプログラムは"end"と入力すると終了します。