gpt4 book ai didi

Java:使用引导类路径阻止找到 H2 驱动程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:06:05 24 4
gpt4 key购买 nike

如果我构建自己的 rt.jar 的修补版本(称为 my-rt.jar )来自 Oracle JDK 7 源并将其与 bootclasspath Hook 机制,像这样,

$ 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 switch 和其他一切都和以前一样,我可以很好地加载驱动程序,应用程序的其余部分也可以正常工作。

那么,在 JDBC 驱动程序(例如 H2)的初始化内部是否有任何特殊情况阻止我使用 bootclasspath 机制?或者,bootclasspath 有什么特别之处吗?它不允许加载像 H2 这样的 JDBC 驱动程序的机制?

我没有什么可以尝试的了。例如,

  1. 我什至从源代码重新构建了 H2 驱动程序,并确保我的应用程序和驱动程序都使用相同版本的 javac .

  2. 我已经从 Eclipse 和命令行中尝试了上述方法。

  3. 我已经在 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 驱动程序!

(我也有 posted this on the H2 google group,但在那里没有得到回应。也许,那些人不认为这是一个 H2 问题,所以我在这里问。)

最佳答案

我搞定了。这是我所做的。

我首先将 original rt.jar 添加到 original rt.jar 之前,如下所示:

$ java -Xbootclasspath/p:/path/to/orig/rt.jar -cp /path/to/h2-1.3.174.jar main

异常消失了!这清楚地告诉我,bootclasspath/p 机制不会干扰 H2 驱动程序的加载。

因此,然后我解压了原始的 rt.jar 并用 my-rt.jar 的解压内容对其进行了diff,我发现 my-rt.jar 中丢失了大约 8000 个文件:

$ wc -l *.list
11285 my-rt.jar.list
19059 rt.jar.list
30344 total

所以,显然,我从官方 src.zip 构建的 my-rt.jar 中缺少大量内容。难怪 H2 驱动程序加载有问题。

为了进一步确认,这次我只将修改后的 java/lang/Object.class 复制到原始 rt.jar 的未压缩内容中,然后看看,H2 驱动程序继续正常加载。

因此,名称 src.zip 是一个可怕的用词不当。因为它没有构建 rt.jar 所需的一切,所以它应该被称为 partial-src.zip(或类似的名称)。

关于Java:使用引导类路径阻止找到 H2 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21322912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com