in toolchains/DumpPlatformClassPath.java [83:130]
static boolean dumpJDK9AndNewerBootClassPath(
int hostMajorVersion, Path output, Path targetJavabase) throws IOException {
// JDK 9 and newer support cross-compiling to older platform versions using the --system
// and --release flags.
// * --system takes the path to a JDK root for JDK 9 and up, and causes the compilation
// to target the APIs from that JDK.
// * --release takes a language level (e.g. '9') and uses the API information baked in to
// the host JDK (in lib/ct.sym).
// Since --system only supports JDK >= 9, first check of the target JDK defines a JDK 8
// bootclasspath.
List<Path> bootClassPathJars = getBootClassPathJars(targetJavabase);
if (!bootClassPathJars.isEmpty()) {
writeClassPathJars(output, bootClassPathJars);
return true;
}
// Initialize a FileManager to process the --system argument, and then read the
// initialized bootclasspath data back out.
Context context = new Context();
JavacTool.create()
.getTask(
/* out = */ null,
/* fileManager = */ null,
/* diagnosticListener = */ null,
/* options = */ Arrays.asList("--system", String.valueOf(targetJavabase)),
/* classes = */ null,
/* compilationUnits = */ null,
context);
StandardJavaFileManager fileManager =
(StandardJavaFileManager) context.get(JavaFileManager.class);
SortedMap<String, InputStream> entries = new TreeMap<>();
for (JavaFileObject fileObject :
fileManager.list(
StandardLocation.PLATFORM_CLASS_PATH,
"",
EnumSet.of(Kind.CLASS),
/* recurse= */ true)) {
String binaryName =
fileManager.inferBinaryName(StandardLocation.PLATFORM_CLASS_PATH, fileObject);
entries.put(binaryName.replace('.', '/') + ".class", fileObject.openInputStream());
}
writeEntries(output, entries);
return true;
}