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

标签 java tomcat dll jna

我们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/

相关文章:

java - 在一行中用数组初始化 ArrayList

java - 如果 2 个节点同时启动,则它们看不到对方

java - 在 WSL 上安装 tomcat 9

tomcat - Grails --- 如何从 Tomcat 获取数据到我的 Grails 应用程序?

java - 在 Java 中动态更改 ResourceBundle Locale

c++ - DLL 注入(inject)有效,除非我在 Qt Creator 中编译它

java.lang.ClassCastException : Z cannot be cast to java. lang.String

java - 将先前添加的对象的成员打印到链表中

c++ - 继承自模板的 MSVC DLL 导出类导致 LNK2005 已定义错误

asp.net - 如何将 ASP.NET 网站编译为单个 DLL 文件?