有没有办法配置 OpenJFX 11 以将其 DLL 提取到不同的用户指定目录中?
在尝试将现有的 Java 10/Maven 项目迁移到 Java 11 时,我尝试使用 OpenJDK 11。为了使代码构建正常工作,我需要将 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 库。注意不要在系统属性的“cacheDir”部分使用驼峰式大小写概念(就像在之前的评论和拉取请求评论中使用的一样)。
查看此 Pull-Request了解详情。
在 12 之前的版本中,OpenJFX 会将其 native 库提取到基于 user.home
(System.getProperty("user.home") + "/.openjfx/缓存/"+ jfxVersion
).
有两种方法可以修改 OpenJFX 将用作缓存位置的路径
- 自行提供原生库并将其存储在自定义位置。然后使用
java.library.path
系统属性告诉 OpenJFX 从您的自定义位置加载它(这将避免提取到固定缓存位置)。 - 修改
user.home
,修改缓存位置。
查看此 Code了解详情。
关于java - 配置 OpenJFX 11 以将其 DLL 提取到不同的用户指定目录中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53382810/