Java Can';在jdk9+;

Java Can';在jdk9+;,java,java-9,bootclasspath,Java,Java 9,Bootclasspath,openjdk文档“JEP 261:模块系统”指出: “一个相关选项,-Xbootclasspath/A,允许将文件和目录附加到默认引导类路径。此选项以及java.lang.instrument包中的相关API有时由检测代理使用,因此为了兼容性,在运行时仍支持此选项。” 它的值(如果指定)通过JDK特定的系统属性JDK.boot.class.path.append报告 但是,当我尝试使用此功能时,它不起作用。具体地说,我正在使用Java代理进行检测 在JDK7和JDK8上均可正常工作。在JDK9

openjdk文档“JEP 261:模块系统”指出:

“一个相关选项,
-Xbootclasspath/A
,允许将文件和目录附加到默认引导类路径。此选项以及
java.lang.instrument
包中的相关API有时由检测代理使用,因此为了兼容性,在运行时仍支持此选项。”

它的值(如果指定)通过JDK特定的系统属性
JDK.boot.class.path.append
报告

但是,当我尝试使用此功能时,它不起作用。具体地说,我正在使用Java代理进行检测

JDK7JDK8上均可正常工作。在JDK9+上,
-Xbootclasspath/a
似乎工作正常,但系统属性
jdk.boot.class.path.append
始终为
null

在java 7/8上:

一切正常

在java 9上:

始终返回空字符串

我添加了一些调试代码来转储所有系统属性,但似乎没有这样的属性

我尝试了
jdk-9.0.4
jdk-11.0.3
,结果类似


关于如何在JDK9+上获取bootclasspath有什么想法吗?

我怀疑这条评论与问题有关:“javac编译器只支持遗留模式下的-Xbootclasspath选项”;“当编译环境(由-source、-target和--release选项定义)小于或等于8时,将启用传统模式。不能使用上述模块化选项。”系统属性“jdk.boot.class.path.append”可以由JVMTI代理使用JVMTI GetSystemProperty函数读取,但java代理不可用。我认为这有助于理解为什么java代理需要知道-Xbootclasspath/a的值。它暴露于JVMTI代理的唯一原因是VM启动问题,该值在onload阶段可能有用。Java代理在VM完全初始化之前无法启动。这一点很好。我没有编写有问题的代码,但我的理解如下:我们的测试生成/检测工具()允许用户为Java运行时方法指定替代方法。这主要是为了允许java.awt和javax.swing的替换关闭对话框,以便测试可以在无人参与的情况下运行。由于对这些例程的一些调用是动态生成的,因此它们与引导加载程序相关联。这意味着要使类/名称解析工作,替换类也必须由引导加载程序加载。听起来您应该使用核心反射来反思修改后的类。还请注意,java代理可以在代理JAR文件中指定引导类路径属性,因此不需要使用-Xbootclasspath/a。它们还可以通过Instrumentation API添加到引导类加载程序搜索中。
String bootclasspath = System.getProperty(`sun.boot.class.path`);
String bootclasspath = System.getProperty("jdk.boot.class.path.append");