Referring to a different --system

Alan Bateman Alan.Bateman at
Fri Mar 10 08:42:25 UTC 2017

On 10/03/2017 06:09, Jayaprakash Artanareeswaran wrote:

> Hello,
> I remember there was an open issue about not being able to use a different JDK 9 (different than the current one) for class lookup. I raised this question some time back and the following solution was suggested:
> <>
> At that point this solution only worked when the compiler was from a JDK 8 and not across different versions of JDK 9. This continues to be the case even today with Eclipse.
> For convenience, the code proposed was this:
> URL url = Paths.get(jdkHome, "jrt-fs.jar").toUri().toURL();
>            URLClassLoader loader = new URLClassLoader(new URL[] { url });
>            FileSystem fs = FileSystems.newFileSystem(URI.create("jrt:/"),
> Collections.emptyMap(), loader);
> Even today when I run the compiler with ea+159 and trying load JRT from ea+153, I can clearly see that the JrtFileSystem returned is still pointing to ea+159.
> But I also noticed Javac is able to refer to different JDK 9 without any issue with --system., which makes me wonder if we should adjust our code in some way too.
JDK 8 does not have a `jrt` file system provider so the above code 
allows it to be loaded from the target run-time image when needed. A 
small nit in the above is that the path to jrt-fs.jar should be created 
with Paths.get(jdkHome, "lib", "jrt-fs.jar").

JDK 9 has a built-in `jrt` file system provider. In the above code 
fragment then your URLClassLoader does parent delegation and so the 
built-in `jrt` file system provider will be loaded, nothing will be 
loaded from jrt-fs.jar. This is why it accesses the "local" jdk-9+159 
image rather the "remote" jdk-9+153 image.

In any case, things have moved on significantly since that thread in 
early 2015. The `jrt` file system provider was updated to support access 
to other run-time images. This is done by specifying a key of 
"java.home" in the map that you use to configure the file system. The 
map value is the file system location of the runtime image. Can you try 

    FileSystem fs = FileSystems.newFileSystem(URI.create("jrt:/"), 
Map.of("java.home", target));

where `target` is a string with the location of the target run-time image.


More information about the jigsaw-dev mailing list