从 JNA jar 文件中提取 DLL 到自定义路径

Extract DLL from within JNA jar file to a custom path

我们的 Java Web 应用程序部署的生产环境有几个权限限制,其中之一是无法写入驱动器 C:

我们最近添加了 jna-4.1.0.jar 和 jna-platform-4.1-0.jar 依赖项以便能够读取 Windows 注册表,但我注意到每次服务器(Tomcat v7.0) 启动一个 DLL 文件被提取到 Tomcat 临时文件夹,出现以下错误:

java.lang.UnsatisfiedLinkError: C:\Program Files\Apache Software Foundation\Tomcat 7.0\temp\jna-1319675979\jna1892288885647543043.dll: The handle is invalid

我已经验证在删除访问权限限制时成功提取了同一个 DLL 以确保这是我的问题的根源,但我想知道是否有任何方法可以指定该 DLL 所在的自定义路径必须提取到,因为我们可以写入驱动器 E:,例如。

您看到的 DLL 是 JNA 的 JNI 库,用于分派本机调用 [0]. JNA will extract the library to a temporary folder, unless found from the directory specified by the jna.boot.library.path property [1], or with System.loadLibrary [2]

可以使用 jna.tmpdir 属性 [3] 设置用于临时项目的目录。例如:

java -jar program.jar -Djna.tmpdir=E:/temp

如果未设置jna.tmpdir,JNA 将使用java.io.tmpdir

请注意,在撰写本文时,JNA 将使用 File.mkdirs() 创建 tmpdir 的目录结构,因此您无需确保文件夹存在。