<< 2009/09/04 | Home | 2009/09/06 >>
PR: 転職    お墓    エコ    通販    結婚相談所    シルバー    質屋    葬式    漫画    エステサロン   

クラスパスに関する誤解

クラスパスについて、誤解していたことがいくつかあったのでメモ。

jarファイル内のMANIFEST.MFに書くClass-Path指定は、java -cpで指定する場合にも効く。

自分が、なぜ効かないと思っていたのかは不明だけど、アプリケーションサーバ下とか、java -jarで実行する時にしか、効かないものだと思っていた。もちろんそんなことは無い。

--- A.java ---
public class A {
}

--- a.jar ---
-rw-r--r-- 102 5-Sep-2009 11:06:32 META-INF/MANIFEST.MF
-rw-r--r-- 228 5-Sep-2009 11:06:32 A.class

--- META-INF/MANIFEST.MF ---
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 11.0-b15 (Sun Microsystems Inc.)
--- B.java ---
public class B extends A {
public static void main(String[] args) {
}
}

--- b.jar ---
-rw-r--r-- 102 5-Sep-2009 11:13:56 META-INF/MANIFEST.MF
-rw-r--r-- 331 5-Sep-2009 11:13:46 B.class

--- META-INF/MANIFEST.MF ---
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 11.0-b15 (Sun Microsystems Inc.)
Class-Path: a.jar

a.jarと、b.jarを同じディレクトリに置いて、

java -cp b.jar B

で、何のエラーも出力されない。

jarファイル内のMANIFEST.MFに書くClass-Path指定は、芋づる式に末端まで伝搬する。

ちょっとうまい表現が見つからないけど、例を見た方が簡単だ。上記に加えて、c.jarを作る。

--- C.java ---
public class C extends B {
public static void main(String[] args) {
}
}

--- c.jar ---
-rw-r--r-- 121 5-Sep-2009 11:17:32 META-INF/MANIFEST.MF
-rw-r--r-- 331 5-Sep-2009 11:17:34 C.class

--- META-INF/MANIFEST.MF ---
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 11.0-b15 (Sun Microsystems Inc.)
Class-Path: b.jar

Cの実行には、BとAが必要だ。だから、普通なら、

Class-Path: a.jar b.jar

だろう。でも必要ないのだ。b.jarだけで良い。なぜなら、b.jar側のMANIFEST.MFに、

Class-Path: a.jar

と書いてあるから。

java -cp c.jar C
で、実行できる。これが「芋づる式」と表現した挙動だ。依存ライブラリが幾つもあるライブラリがある場合、クラスパスだけを書いた、空のJARファイルを何個か用意して、使い分けるなんてものも、ありかもね。

 

Ubuntu 9.10 Alpha5

IMが、scimからibusというのに変わるということなので、ちょっと試してみた。

インストーラが途中でハングするので、alternate版を使用。でも、インストール完了後の再起動で画面まっくら。GeForce 9500とは相性悪いのかな。とりあえずディスプレイの接続を1つに減らしてみたら、あっさり立ち上がった。

ibusそのものは、まだ辞書とか入ってないのか、漢字変換ができない状態。で、前にやったJavaのアプリケーションのテスト。なんだこりゃ、全然だめ。バグも引き継がれているようだ。

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8