【问题标题】:Why can't I load resources which are appended to the bootstrap class loader search?为什么我不能加载附加到引导类加载器搜索的资源?
【发布时间】:2018-07-15 10:21:33
【问题描述】:

当通过java.lang.instrument.Instrumentation#appendToBootstrapClassLoaderSearch 将 jar 添加到引导类加载器时,我无法通过以下方式加载它的任何资源

ClassLoader.getSystemClassLoader().getResource("org/example/ClassInBootstrapJar.class")

但是,ClassLoader#loadClass 按预期工作:

ClassLoader.getSystemClassLoader().loadClass("org.example.ClassInBootstrapJar")

问题似乎是这种方式添加到引导类加载器的jar没有添加到java.lang.ClassLoader#getBootstrapClassPath,所以java.lang.ClassLoader#getBootstrapResource在添加的jar中找不到资源(这里指Java 8)。

当通过 javaagent 的 META-INF/MANIFEST.MF 文件中的 Boot-Class-Path: my-bootstrap.jar 条目添加 jar 时,ClassLoader#getResource 也可以正常工作。

为什么java.lang.instrument.Instrumentation#appendToBootstrapClassLoaderSearch 的行为在这里有所不同,有没有办法让getResource 与它一起工作?

【问题讨论】:

  • 我以前从未想过,但您描述的行为可以解释为什么该方法被命名为appendToBootstrapClassLoaderSearch 而不是appendToBootstrapClassPath,即它仅适用于类加载,不适用于资源查找。这也符合文档中句子的字面意思:“当虚拟机的内置类加载器(称为“引导类加载器”)搜索类失败时,JAR 文件中的条目将被搜索为好吧。”,没有说任何关于资源查找的事情。
  • 可能的答案是它就是这样。还是有点搞不懂为什么。我想唯一的解决方法是使用 Boot-Class-Path 清单条目。

标签: java javaagents bytecode-manipulation


【解决方案1】:

前几天我遇到了同样的问题。看起来 appendToBootstrapClassLoaderSearch() 不会更新引导类路径属性 (sun.boot.class.path),而 BootClassLoader 资源搜索是基于此属性的。

http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/file/70e3553d9d6e/src/share/classes/sun/misc/Launcher.java

因此查找失败。对我来说这是缺陷

【讨论】:

    猜你喜欢
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2018-03-26
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多