<div dir="ltr"><div><div class="gmail_default" style="font-family:verdana,sans-serif;font-size:small;color:rgb(0,0,0)"><span style="color:rgb(34,34,34)">Hi,</span></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">I have found a "serious" bug, where two completely independent JFX applications, both with their own embedded runtime (built with jlink & jpackage) & using the same JavaFX version, are unable to run simultaneously, because of the JFX cache -- at least on Windows.</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default"><span style="font-family:verdana,sans-serif">When trying to run any application, NativeLibLoader does a checksum on DLLs in the cache</span><font face="verdana, sans-serif"> (e.g.: C:\Users\xyz\.openjfx\cache\23.0.2+3\amd64\prism_d3d.dll); and tries to delete any files that exist where the checksums do not match (in order to replace them):</font></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> if (!Arrays.equals(isHash, fileHash)) {<br>                Files.delete(f.toPath());<br>            }<span class="gmail_default" style="font-family:verdana,sans-serif"></span></blockquote><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">But a second application <u>fails</u> to start, as it is unable to delete these files because they're in use by the first application (see stacktrace below).</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">But why are the checksums different, shouldn't they be the same? They are different because the DLLs are signed by the builder of the applications -- different authors and different timestamps. So the DLL checksums will be different despite the DLLs being the same, in terms of the JFX version.</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Why are these JFX DLLs signed by the authors? Because for some reason, they come <u>unsigned</u>, and all DLLs when packaged <b><u>should</u></b> be signed, including any embedded in JARs, to avoid alarming Windows Defender warnings and mistrust, etc. There's no point spending a small fortune on Windows code-signing certs and shipping with any unsigned third-party DLLs (including any embedded in JARs). You might sign your own binaries and any unsigned third-party binaries. Similarly for MacOS, everything, including embedded native libs in JARs, etc., needs to be signed for gatekeeper & notarization to allow it.</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">So it would be better if JFX DLLs came signed, to avoid forcing developers to do it (which would also avoid this checksum mishap). Or, if developers need to sign Oracle's DLLs, then this checksum approach isn't suitable. Also, there should really be a proper fallback in place -- a cache bug should not have such a catastrophic outcome.</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">FYI: JLink also removes signatures from a bunch of JDK DLLs when assembling the runtime, but leaves a bunch of Windows DLLs untouched. Personally, I'd prefer all DLLs to come signed, and let the developers re-sign if they want. Removing the signatures is adding unnecessary hurdles for folks, for no benefit I can see.</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Anyway, example stacktrace:</div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Loading D3D native library ...<br>WARNING: java.lang.UnsatisfiedLinkError: Can't load library: C:\Program Files\KafkIO\bin\prism_d3d.dll<br>Loading library prism_d3d from resource failed: java.nio.file.AccessDeniedException: <span class="gmail_default" style="font-family:verdana,sans-serif"></span>C:\Users\<span class="gmail_default" style="font-family:verdana,sans-serif"></span>x<span class="gmail_default" style="font-family:verdana,sans-serif">yz</span>\.openjfx\cache\23.0.2+3\amd64\prism_d3d.dll<br>java.nio.file.AccessDeniedException: C:\Users\<span class="gmail_default" style="font-family:verdana,sans-serif"></span>x<span class="gmail_default" style="font-family:verdana,sans-serif">yz</span>\.openjfx\cache\23.0.2+3\amd64\prism_d3d.dll<br>        at java.base/sun.nio.fs.WindowsException.translateToIOException(Unknown Source)<br>        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)<br>        at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(Unknown Source)<br>        at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(Unknown Source)<br>        at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(Unknown Source)<br>        at java.base/java.nio.file.Files.delete(Unknown Source)<br>        at com.sun.glass.utils.NativeLibLoader.cacheLibrary(NativeLibLoader.java:300)<br>        at com.sun.glass.utils.NativeLibLoader.installLibraryFromResource(NativeLibLoader.java:218)<br>        at com.sun.glass.utils.NativeLibLoader.loadLibraryFromResource(NativeLibLoader.java:200)<br>        at com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:142)<br>        at com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:58)<br>        at com.sun.prism.d3d.D3DPipeline.lambda$static$0(D3DPipeline.java:54)<br>        at java.base/java.security.AccessController.doPrivileged(Unknown Source)<br>        at com.sun.prism.d3d.D3DPipeline.<clinit>(D3DPipeline.java:50)<br>        at java.base/java.lang.Class.forName0(Native Method)<br>        at java.base/java.lang.Class.forName(Unknown Source)<br>        at java.base/java.lang.Class.forName(Unknown Source)<br>        at com.sun.prism.GraphicsPipeline.createPipeline(GraphicsPipeline.java:218)<br>        at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:92)<br>        at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)<br>        at java.base/java.lang.Thread.run(Unknown Source)<br>GraphicsPipeline.createPipeline failed for com.sun.prism.d3d.D3DPipeline<br>java.lang.UnsatisfiedLinkError: no prism_d3d in java.library.path: C:\Program Files\KafkIO;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Oculus\Support\oculus-runtime;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;c:\dev\apps\apache-maven-3.9.9\bin;C:\dev\apps\cygwin64\bin;C:\Program<span class="gmail_default" style="font-family:verdana,sans-serif"></span> Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Program Files\dotnet\;C:\Program Files\Git\cmd;C:\Program Files\7-Zip;C:\Program Files\SafeNet\Authentication\SAC\x64;C:\Program Files\SafeNet\Authentication\SAC\x32;C:\Program Files\Docker\Docker\resources\bin;%JAVA_HOME%\bin;;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Users\<span class="gmail_default" style="font-family:verdana,sans-serif"></span>x<span class="gmail_default" style="font-family:verdana,sans-serif">yz</span>\scoop\apps\zulu-jdk\current\bin;C:\Users\<span class="gmail_default" style="font-family:verdana,sans-serif"></span><span class="gmail_default" style="font-family:verdana,sans-serif"></span>x<span class="gmail_default" style="font-family:verdana,sans-serif">yz</span>\scoop\apps\zulu22-jdk\current\bin;C:\Users\<span class="gmail_default" style="font-family:verdana,sans-serif"></span>x<span class="gmail_default" style="font-family:verdana,sans-serif">yz</span>\scoop\apps\zulu21-jdk\current\bin;C:\Users\<span class="gmail_default" style="font-family:verdana,sans-serif"></span>x<span class="gmail_default" style="font-family:verdana,sans-serif">yz</span>  \scoop\shims;C:\Users\<span class="gmail_default" style="font-family:verdana,sans-serif"></span>x<span class="gmail_default" style="font-family:verdana,sans-serif">yz</span>  \AppData\Local\Microsoft\WindowsApps;C:\dev\scripts;C:\Program Files\JetBrains\IntelliJ IDEA 2024.2\bin;C:\Program Files\KafkIO\app;.<br>        at java.base/java.lang.ClassLoader.loadLibrary(Unknown Source)<br>        at java.base/java.lang.Runtime.loadLibrary0(Unknown Source)<br>        at java.base/java.lang.System.loadLibrary(Unknown Source)<br>        at com.sun.glass.utils.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:170)<br>        at com.sun.glass.utils.NativeLibLoader.loadLibrary(NativeLibLoader.java:58)<br>        at com.sun.prism.d3d.D3DPipeline.lambda$static$0(D3DPipeline.java:54)<br>        at java.base/java.security.AccessController.doPrivileged(Unknown Source)<br>        at com.sun.prism.d3d.D3DPipeline.<clinit>(D3DPipeline.java:50)<br>        at java.base/java.lang.Class.forName0(Native Method)<br>        at java.base/java.lang.Class.forName(Unknown Source)<br>        at java.base/java.lang.Class.forName(Unknown Source)<br>        at com.sun.prism.GraphicsPipeline.createPipeline(GraphicsPipeline.java:218)<br>        at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:92)<br>        at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)<br>        at java.base/java.lang.Thread.run(Unknown Source)</blockquote><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif"><br></div><div class="gmail_default" style="font-family:verdana,sans-serif">Kind Regards,</div><div class="gmail_default" style="font-family:verdana,sans-serif"><span class="gmail-il">Cormac</span></div></div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div></div><div><br></div><div><br></div></div></div></div></div>