java - 配置 OpenJFX 11 以将其 DLL 提取到不同的用户指定目录中?

标签 java dll runtime java-11 openjfx

有没有办法配置 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 将用作缓存位置的路径

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

查看此 Code了解详情。

关于java - 配置 OpenJFX 11 以将其 DLL 提取到不同的用户指定目录中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53382810/

相关文章:

.net - 需要 C#/C++ DLL 建议

windows - Qt Creator 交叉开发和 Windows DLL

dll - 在 Visual Studio 2013 中添加对您自己的 DLL 项目的依赖项/引用

c++ - 如何在运行时更改 srand()

java - GridLayout 之外的按钮布局

java - 使用 WebDriver 查找元素时出现 ElementNotInteractableException 异常

java - 是否有不可变(通常是 ConcurrentHashMap)数据结构的官方模式,能够定期替换?

java - 如何优化简单的套接字通信?

c# - 在本地窗口中更改 T 类型 int

c++ - VC++ : KB971090 and selecting Visual C Runtime DLL dependencies