On Sun, 10 Nov 2024 14:48:26 GMT, jyxzwd <d...@openjdk.org> wrote:

>> I got it.Thank you for the detailed explanation!Maybe we should consider 
>> another way to load the custom FileSystemProvider.
>
> If we load the custom DefaultFileSystemProvider by SystemClassLoader,then we 
> will step into the method 
> SystemModuleFinders$SystemModuleReader#findImageLocation again, and the var 
> imageReader will be null.But we can not define a custom classLoader to load 
> the custom DefaultFileSystemProvider since it needs to maintain JDK 8 source 
> compatibility.So the only way that I can think of is to use the 
> installedProvider which has the 'file' scheme to directly get the 'modules' 
> path value.
> 
> In ImageReaderFactory:
> 
> private static final Path BOOT_MODULES_JIMAGE = null;
> 
>     static {
>         // check installed providers
>         for (FileSystemProvider provider : 
> FileSystemProvider.installedProviders()) {
>             if ("file".equalsIgnoreCase(provider.getScheme())) {
>                 try {
>                     BOOT_MODULES_JIMAGE = 
> provider.getFileSystem(URI.create("file:/")).getPath(JAVA_HOME, "lib", 
> "modules");
>                     if (BOOT_MODULES_JIMAGE != null) break;
>                 } catch (UnsupportedOperationException uoe) {
>                 }
>             }
>         }
>     }
> 
> What do you think of this?I am new to openjdk source development.So I truely 
> appreciate the time you dedecate to my question!

I assume this will lead to recursive initialisation, e.g. 
`FileSystems.getFileSystem(URI.create("jrt:/"))` will use 
FileSystemProvider.installedProviders to iterate over the installed providers.

I don't have time to look into this more but I think it will have to 
reflectively get the FileSystem so that the code isn't compiled with references 
to the built-in provider, as in something like this (not tested):


    private static final Path BOOT_MODULES_JIMAGE;
    static {
        FileSystem fs;
        if (ImageReaderFactory.class.getClassLoader() == null) {
            // fs = DefaultFileSystemProvider.theFileSystem()
            try {
                fs = (FileSystem) 
Class.forName("sun.nio.fs.DefaultFileSystemProvider")
                        .getMethod("theFileSystem")
                        .invoke(null);
            } catch (Exception e) {
                throw new ExceptionInInitializerError(e);
            }
        } else {
            fs = FileSystems.getDefault();
        }
        BOOT_MODULES_JIMAGE = fs.getPath(JAVA_HOME, "lib", "modules");
    }

Also just to say that we need to create a good test for this issue. I expect it 
will be rarely to interpose on the default file system and use jrtfs at the 
same time, but that is what this bug report is about so we'll need to create a 
good test.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/21997#discussion_r1835741459

Reply via email to