クラスパスに関する誤解
クラスパスについて、誤解していたことがいくつかあったのでメモ。
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のアプリケーションのテスト。なんだこりゃ、全然だめ。バグも引き継がれているようだ。





