我们有一个Java应用程序,其中包含在Windows计算机上以SYSTEM身份运行的组件。在Windows 7 64位系统,一个组件出现故障试图解开jnidispatch库时:在Win7上以SYSTEM身份运行时写入temp dir失败
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 库的评论的一个片段:
当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相关错误,但是如果我能弄清楚它是。任何建议将是最受欢迎的。
宾果。经过一些与procmon挖掘后,我发现了两件事。首先,jnidispatch正在解压。其次,实际失败是由我们使用尝试(和失败)的第三方组件导致的,它在c:\ windows \ sysWOW64 \ config \ systemprofile \ AppData \ Local \ Temp中写入了一个简短的日志文件,该文件不存在。我们已经与组件所有者讨论了这一点,并添加了一个解决方法来创建该目录,当它不存在时,一切都很好。谢谢! – paulr 2009-12-18 18:02:04