On Mon, 9 Dec 2024 12:31:54 GMT, liyazzi <d...@openjdk.org> wrote:

>> For two cases:
>> 
>> 1. When the ImageReaderFactory was loaded by local jdk,that means the 
>> ImageReaderFactory was loaded by boot class loader,then init the `Path 
>> BOOT_MODULES_JIMAGE` by using `sun.nio.fs.DefaultFileSystemProvider` which 
>> is obtained through reflection,due to it is in jdk internal.
>> 2. When loaded by a target jdk, such as jdk8 runtime, then use the Java 8 
>> compatible APIs: `FileSystems.getDefault()` to init the 
>> `BOOT_MODULES_JIMAGE` field.
>> Then we can avoid the circular dependencies in class loading caused by 
>> loading the defaultSystemProvider.
>
> liyazzi has updated the pull request incrementally with one additional commit 
> since the last revision:
> 
>   add '\s' to avoid trailing whiteSpace

The update to ImageReaderFactory is what I suggested in the other PR so that 
part is okay.

The proposed test is very different to what I would have expected, meaning I 
was surprised to see it setting BOOT_MODULES_JIMAGE and needing to run with 
--add-exports.  It can be massively simplified with `@build` tag to compile the 
test provider, using ToolProvider to run jlink with `--add-options` to set the 
system provider to override the default provider, e.g.

        String mlib = Path.of(System.getProperty("test.classes"), 
"modules").toString();
        String imageDir = "myimage";
        ToolProvider jlink = ToolProvider.findFirst("jlink").orElseThrow();
        int res = jlink.run(System.out, System.err,
                "--module-path", mlib,
                "--add-modules", "customfs",
                "--add-options", 
"-Djava.nio.file.spi.DefaultFileSystemProvider=customfs.CustomFileSystemProvider",
                "--output", imageDir);
        if (res != 0) {
            throw new RuntimeException("jlink failed");
        }

        String launcher = Path.of(imageDir, "bin", "java").toString();
        String[] cmd = { launcher, "--list-modules" };
        var pb = new ProcessBuilder(cmd);
        OutputAnalyzer outputAnalyzer = ProcessTools
                .executeProcess(pb)
                .outputTo(System.err)
                .errorTo(System.err);
        outputAnalyzer.shouldHaveExitValue(0);

Even better would if we updated 
test/jdk/java/nio/file/spi/SetDefaultProvider.java to add this as a test case. 
Right now, this test exercises several different configurations and this issue 
is really just another configuration.

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

PR Comment: https://git.openjdk.org/jdk/pull/22628#issuecomment-2528106421

Reply via email to