我们有一个 Java 应用程序,其中包含在 Windows 机器上作为 SYSTEM 运行的组件。在 Windows 7 x64 上,一个组件在尝试解压缩 jnidispatch 库时失败:
Exception in thread "main" java.lang.Error: Failed to create temporary file for
jnidispatch library: java.io.IOException: The system cannot find the path
specified
at com.sun.jna.Native.loadNativeLibraryFromJar(Native.java:600)
at com.sun.jna.Native.loadNativeLibrary(Native.java:550)
at com.sun.jna.Native.<clinit>(Native.java:87)
at falcon.util.vmware.VcmdTwo.loadLibraries(VcmdTwo.java:53)
下面复制的是 jna 库中 Native 类的注释片段:
加载 JNA 类时,也会加载本机共享库 (jnidispatch)。尝试使用 {@link System#loadLibrary} 从系统库路径加载它。如果没有找到,相应的库将从类路径中提取到一个临时目录并从那里加载。
好的,到目前为止一切顺利:Java 正在尝试将 jnidispatch.dll 解压缩到 java.io.tmpdir 指向的任何内容中。问题似乎是 java.io.tmpdir 指向该特定进程的C:\Windows\system32\config\systemprofile\AppData\Local\Temp\。此目录存在且 SYSTEM 具有完全控制权。但是,将 jnidispatch DLL 提取到该目录总是失败。如果我修改我们应用程序中的代码以手动将文件写入同一目录,则写入成功。
我查看了相关的 Java 和 JDK 代码,并没有看到任何明显的不当行为,所以我不得不得出结论,这是一些奇怪的 Win7 UAC 相关错误,但如果我能弄清楚它是什么,那该死的。任何建议都将受到欢迎。