Get Things Right

My English blog is here http://getthingsright.blogspot.com/

Java とVBにおけるプログラムローディング機構 Program Loading on Java, VB

Main not found error :Javaのプログラムを走らせてこのエラーが出たらclasspathの設定が正しく設定されていないことが第一に疑われる。

JavaJava Virtual Machine(JVM)の上で動く。JVMはバイナリーフォーマットのclassファイルを読み込み、それを実行することで動く。だからJVMはそのclassファイルのpath(場所)を知っている必要がある。

JVMにその場所を教える方法はいくつかある。代表的なものは環境変数classpathを設定しておくか、もしくはコマンドラインで実行時に直接指定すること。自分でカスタムクラスローダを作りネットワークを介して、もしくはデータベースにレコードとして格納してから取得することもできる。Javaが動くためにはバイナリーフォーマットがJavaのclassファイルフォーマットに準拠していることが重要であり、バイナリーストリームをどこから受け取るのかは重要ではない。このようなバイナリーストリームのやり取りが必要なのはパーシスタントレイヤー(電源を入れてもデータが消えない場所)は非常に読み書きが遅いがコストが低いためにリソースを格納する場所として使用され、実行する際には読み書きが早いメモリーに移さなければならないという現代のハードウェア事情が反映されている。

プログラム言語はハードウェアリソースを効率よく活用するための文法体系であり、その時代のハードウェアトポロジーが反映される。汎用機とCobol言語、UnixとC言語、インターネットとJava。それぞれコンピューターが新しい使われ方をした際、それに適した言語として広まってきたといえる。その意味ではクラウドという言葉で形容される大規模分散処理機構が次世代の本命だとしたらRubyのRoma(分散ストレージ)とFairy(分散処理基盤)との関係は今後注目に値する。

VBにおけるJavaのクラスパスに相当するものはレジストリー。そこにはDLLファイル等の絶対パスが記述してあり、VBプログラムはどこからバイナリーストリームを読み込むかレジストリーを参照する。レジストリーとDLLファイルは共有されており新しいプログラムをインストールする度に書き換わる危険をはらんでいるためシステムが脆弱なものならざる得ない。マイクロソフトが.NETフレームワークに移行を促すのも当然といえよう。

またこのことを理解するとJavaClasspath設定はコマンドライン(shell/Batch)で実行時に設定することが環境変数設定に頼ることより望ましいことが分かる。環境変数は共有されておりコマンドライン時の設定と比べてコントロールが及びにくいからだ。
Reference:

Component Development for the Java™ Platform (DevelopMentor Series)

Component Development for the Java™ Platform (DevelopMentor Series)

http://www.develop.com/technology/bookdownload.aspx
http://www.atmarkit.co.jp/news/200711/26/rakuten.html