"Hello"クラスのコンパイルとCLASSPATH。

"Hello.java"のコンパイルに成功したものの、実行すると以下のエラー。

Exception in thread "main" java.lang.NoClassDefFoundError: Hello

まず疑ったことと試したことは、次の通り。

  • 打ち間違いがある。ソースを見直す。ダメなら打ち直す。
  • JDKのバージョンがあってない。JDKのバージョンは良く分からないのだけど、「J2EE 1.4 includes JDK 5.0」だと微妙に何かあわないのかも。ダウンロードページの「JDK 5.0 Update 6」のリンク先にあるものに入れ替えてみる。
  • 誤植がある。「書籍に掲載されたプログラムリストのダウンロード」から結城さんの動作しているソースを取得し、動かしてみる。

どれをやってもダメだったので、次にパスなどを疑ってみる。僕のパソコンは、仕事に応じてJREJava実行環境、JDKにもJREは含まれている)やら、Oracleクライアント(JREなども一緒に入ってくる)やらをインストール・アンインストールしてきているマシンなので、何か良くない状況があるかもしれない。
まずはenv...じゃなかった、setコマンド。

C:\j2sdk1.4.2_11\study\1>set
CLASSPATH=C:\Program Files\QuickTime\QTSystem\QTJava.zip
Path=C:\j2sdk1.4.2_11\bin\;C:\Oracle\product\10.1.0\Client_1\bin;C:\Oracle\product\10.1.0\Client_1\jre\1.4.2\bin\client;C:\Oracle\product\10.1.0\Client_1\jre\1.4.2\bin;C:\Perl\bin\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\PROGRA~1\NcFTP;C:\usr\bin;C:\Program Files\QuickTime\QTSystem\

しばらくはPathを気にしていて、案の定OracleJREなどにパスが通っていたりしたのでこれを外してみたりと試行錯誤したのだけど、これは不正解。正解はなんとなくJava絡みで聞き覚えのあるCLASSPATHの方でした。

C:\j2sdk1.4.2_11\study\1>set CLASSPATH
CLASSPATH=C:\Program Files\QuickTime\QTSystem\QTJava.zip

C:\j2sdk1.4.2_11\study\1>java Hello
Exception in thread "main" java.lang.NoClassDefFoundError: Hello

C:\j2sdk1.4.2_11\study\1>set CLASSPATH=

C:\j2sdk1.4.2_11\study\1>java Hello
Hello.

えーと、内容からするとQuickTime(が同梱されているiTunes)をインストールしたことで設定された環境変数かな?
正直に言って、今のところCLASSPATHは「聞き覚えがあるから、きっとJava関連」「名前からするとPerlの@INC(ライブラリの検索パス)みたいなもの?」という程度の認識しかありません。まして、何でこれが設定されていると実行がうまくいかないのかもさっぱり。上巻のインデックスを見てもCLASSPATHは載っていないので、焦って調べたりせずに、これはとりあえず「そういうものだ」と思っておくことにします。
きっとその内分かるでしょうから、慌てない慌てない、ひと段落ひと段落。

(2006年4月13日追記)

iTunesのバージョンアップに伴うQuickTimeのインストールでCLASSPATHが設定されてしまう - 結城さんのはてな日記」にこの件が載っていることを、コメントで教えてもらいました。ありがとうございます。
やっぱりCLASSPATHの問題で、やっぱりそれがどういけないのか僕には理解できてないのですが、ひとまずこの対応で良さそうです。