8

有没有办法配置 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
4

1 回答 1

3

先前讨论和链接资源的摘要

从 OpenJFX 12 开始,您可以使用系统属性javafx.cachedir来告诉 OpenJFX 在哪里提取它的本机库。注意不要在系统属性的“cache D ir”部分使用驼峰式概念(就像在之前的评论和拉取请求评论中使用的那样)。

有关详细信息,请参阅此Pull-Request

在 12 之前的版本中,OpenJFX 会将其本机库提取到基于user.home( System.getProperty("user.home") + "/.openjfx/cache/" + jfxVersion) 的固定路径。

有两种方法可以修改 OpenJFX 将用作缓存位置的路径

  1. 自己提供本机库并将其存储在自定义位置。然后使用java.library.path系统属性告诉 OpenJFX 从您的自定义位置加载它(这将避免提取到固定缓存位置)。
  2. 修改user.home以修改缓存位置。

有关详细信息,请参阅此代码

于 2019-05-09T15:05:24.327 回答