3

Oracle JDK 7 ソースからrt.jar(と呼ばれる)の独自のいじくり回したバージョンを構築し、このようにメカニズムにフックすると、my-rt.jarbootclasspath

$ 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 ドライバーのロードを許可しないというメカニズムに特有のものはありますか?

試してみたいことがなくなりました。例えば、

  1. ソースから H2 ドライバーを再構築し、アプリケーションとドライバーの両方が同じバージョンのjavac.

  2. 上記をEclipseとコマンドラインの両方から試しました。

  3. 2台の異なるマシンで試しました。

すべて同じ例外が発生します。

ところで、私のいじくり回しにmy-rt.jarは非常に単純な編集があります。上記の行の前に、スイッチが有効になっているときの値を実際に出力できることを確認できます。public static int counterjava.lang.ObjectClass.forName(...)counterbootclasspath

counter奇妙なことに、このフィールドをコメントアウトしても先頭に追加しjava.lang.Object続けてもmy-rt.jar(つまり、元の と同じように、rt.jar再コンパイルして先頭に追加するだけです)、それでも H2 ドライバーを見つけてロードすることはできません!

(私はこれを H2 Google グループにも投稿しましたが、そこには応答がありません。おそらく、それらの人々はこれが H2 の問題だとは考えていないので、ここで質問しています。)

4

1 に答える 1