【发布时间】: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