我们Java Web Application部署的生产环境有几个权限限制,其中一个是不能写入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: 句柄无效
我已经验证在删除访问权限限制时成功提取了同一个 DLL,以确保这是我的问题的根源,但我想知道是否有任何方法可以指定该 DLL 必须位于的自定义路径提取到,因为我们可以写入驱动器 E:,例如。
最佳答案
您看到的 DLL 是 JNA 的 JNI 库,用于分派(dispatch) native 调用 [0] . JNA 会将库提取到临时文件夹,除非从 jna.boot.library.path
属性指定的目录中找到 [1] ,或使用 System.loadLibrary
[2] .
可以使用jna.tmpdir
属性设置用于临时项目的目录[3] .例如:
java -jar program.jar -Djna.tmpdir=E:/temp
如果未设置jna.tmpdir
,JNA 将使用java.io.tmpdir
。
请注意,在撰写本文时,JNA 将使用 File.mkdirs()
来创建 tmpdir
的目录结构,因此您无需确保文件夹存在。
关于java - 从 JNA jar 文件中提取 DLL 到自定义路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43774860/