Oracle JDK 7 ソースからrt.jar
(と呼ばれる)の独自のいじくり回したバージョンを構築し、このようにメカニズムにフックすると、my-rt.jar
bootclasspath
$ java -Xbootclasspath/p:/path/to/my-rt.jar -cp /path/to/h2-1.3.174.jar main
次に、アプリケーションの開始時に H2 ドライバーをロードすることさえできません。
// Application's main.java
public class main {
public static void main(String[] args) {
// ...
Class.forName("org.h2.Driver"); // Line 145
}
}
上記の結果、次の例外が発生します。
Exception in thread "main" java.lang.ClassNotFoundException: org/h2/Driver
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:190)
at main.main(main.java:415)
ただし、-Xbootclasspath/p
スイッチを削除して他のすべてを以前と同じにすると、ドライバーを正常にロードでき、アプリケーションの残りの部分も正常に動作します。
では、JDBC ドライバー (H2 など) の初期化中に、bootclasspath メカニズムの使用を妨げている奇妙なことが起こっているのでしょうか? bootclasspath
それとも、 H2 のような JDBC ドライバーのロードを許可しないというメカニズムに特有のものはありますか?
試してみたいことがなくなりました。例えば、
ソースから H2 ドライバーを再構築し、アプリケーションとドライバーの両方が同じバージョンの
javac
.上記をEclipseとコマンドラインの両方から試しました。
2台の異なるマシンで試しました。
すべて同じ例外が発生します。
ところで、私のいじくり回しにmy-rt.jar
は非常に単純な編集があります。上記の行の前に、スイッチが有効になっているときの値を実際に出力できることを確認できます。public static int counter
java.lang.Object
Class.forName(...)
counter
bootclasspath
counter
奇妙なことに、このフィールドをコメントアウトしても先頭に追加しjava.lang.Object
続けてもmy-rt.jar
(つまり、元の と同じように、rt.jar
再コンパイルして先頭に追加するだけです)、それでも H2 ドライバーを見つけてロードすることはできません!
(私はこれを H2 Google グループにも投稿しましたが、そこには応答がありません。おそらく、それらの人々はこれが H2 の問題だとは考えていないので、ここで質問しています。)