有没有一种方法可以配置OpenJFX 11将其DLL提取到其他用户指定的目录中?
在尝试将现有的Java 10/Maven项目迁移到Java 11时,我尝试使用OpenJDK11。为了使代码构建正常进行,我需要将JavaFX JAR添加到Maven pom.xml配置文件中(因为JavaFX不再是Java 11的内置部分)。
但是,在运行时,我发现由于OpenJFX将DLL文件提取到用户目录中而导致访问失败的错误(请参见下面的错误)。多年来,我有许多项目在使用C:\Users *目录时出错(来自Microsoft Windows,干扰文件锁和目录权限,防病毒扫描等),因此我尽量避免使用这些目录可能的。 Java项目可以在Windows 7和RedHat 7上的Java 10下正常运行,这似乎暗示Oracle的JavaFX 10 JAR不会将DLL提取到C:\Users *目录中。 OpenJFX似乎可以轻松地将DLL写入这些目录中,但是此后它无法读取那些相同的文件。
我正在带有Service Pack 1的Microsoft Windows 7 Professional 64位上运行。我还没有尝试在Linux上与OpenJDK 11和OpenJFX一起运行,但是我想OpenJFX也会尝试在该平台上提取其DLL。
由OpenJFX引起的示例运行时Java错误:
Loading library prism_d3d from resource failed: java.lang.UnsatisfiedLinkError: C:\Users\MyUserName\.openjfx\cache\11\prism_d3d.dll: Access is denied
java.lang.UnsatisfiedLinkError: C:\Users\MyUserName\.openjfx\cache\11\prism_d3d.dll: Access is denied
Loading library prism_sw from resource failed: java.lang.UnsatisfiedLinkError: C:\Users\MyUserName\.openjfx\cache\11\prism_sw.dll: Access is denied
java.lang.UnsatisfiedLinkError: C:\Users\MyUserName\.openjfx\cache\11\prism_sw.dll: Access is denied
Graphics Device initialization failed for : d3d, sw
Error initializing QuantumRenderer: no suitable pipeline found
java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
最佳答案
先前讨论的摘要和链接的资源
从OpenJFX 12开始,您可以使用系统属性javafx.cachedir
告诉OpenJFX从何处提取其 native 库。注意而不是,以在系统属性的“cache D ir”部分中使用驼峰大小写概念(就像以前的注释和请求请求注释中使用的一样)。
有关详细信息,请参见此Pull-Request。
在12之前的版本中,OpenJFX将基于user.home
(System.getProperty("user.home") + "/.openjfx/cache/" + jfxVersion
)将其 native 库提取到固定路径。
有两种方法可以修改OpenJFX用作缓存位置的路径
java.library.path
系统属性告诉OpenJFX从您的自定义位置加载它(这将避免提取到固定的缓存位置)。 user.home
以修改缓存位置。 有关详细信息,请参见此Code。