Reading Java 9 bootstrap class bytecode from Java 12?

Alan Bateman Alan.Bateman at oracle.com
Thu Feb 14 07:31:03 UTC 2019


On 14/02/2019 00:33, Ess Kay wrote:
> Is there any way of accessing Java 9's bootstrap classes from within Java
> 12 to access Java 9's bootstrap classes? If run using Java 12, the snippet
> below always finds the Java 12 file system rather than the required Java 9
> file system.  My immediate issue is that I am inappropriately finding
> java.lang.constant.Constable when searching for the implemented interfaces
> of java.lang.invoke.MethodHandle in Java 9 bytecode.
>
> String targetImage = <...Java9_HOME...>
> URL url = Paths.get(targetImage, "lib", "jrt-fs.jar").toUri().toURL();
> URLClassLoader loader = new URLClassLoader(new URL[] { url });
> FileSystem fs = FileSystems.newFileSystem(URI.create("jrt:/"),
> Collections.emptyMap(), loader);
You are using a URLClassLoader and I assume it's delegating so you are 
loading the jrt file system provider from the current runtime, not from 
jrt-fs.jar in the target runtime. Running with -verbose should confirm that.

The simplest way to cross target is to specify the java.home parameter 
when creating the file system, e.g:

String javaHome = <JDK 9>
FileSystem fs = FileSystems.newFileSystem(URI.create("jrt:/"), 
Map.of("java.home", javaHome));

-Alan




More information about the jigsaw-dev mailing list