3

我们有一个 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 相关错误,但如果我能弄清楚它是什么,那该死的。任何建议都将受到欢迎。

4

3 回答 3

2

您是否尝试过设置java.io.tmpdir到不同的场地,如此处所讨论?如herehere所述,您可以更改createTempFile()启动Java虚拟机时使用的默认值:

java -Djava.io.tmpdir=/path/to/tmpdir

由于这种方法可能不安全且特定于主机平台,因此只能在跟踪实际问题时使用,例如.

于 2009-12-18T03:07:28.103 回答
2

您是否 100% 确定它正在写入您认为它正在写入的位置?鉴于如果您修改程序以强制它写入那里并且它可以工作,那么听起来您正在尝试写入另一个目录。

于 2009-12-18T03:09:04.407 回答
0

由于以下原因,写入文件可能会失败:
1. 用户权限/s(继承处理)。
2. 损坏的文件(已经存在)。
3. 文件同时被另一个应用程序访问。
4. 文件被反恶意软件/杀毒软件锁定。

我有问题。奇怪的是,我的防病毒软件将 jndispatch.dll 文件检测为不干净的文件并将其转储到其保管库中。
可能是内置的 windows 防御者正在做同样的事情。

查看!

于 2016-01-27T16:26:52.943 回答