2009-12-17 214 views
3

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

回答

2

您是否100%确定它正在写入您认为正在写入的内容?鉴于如果你修改程序来强制它写入那里,它的工作原理听起来像你正试图写入另一个目录。

+2

宾果。经过一些与procmon挖掘后,我发现了两件事。首先,jnidispatch正在解压。其次,实际失败是由我们使用尝试(和失败)的第三方组件导致的,它在c:\ windows \ sysWOW64 \ config \ systemprofile \ AppData \ Local \ Temp中写入了一个简短的日志文件,该文件不存在。我们已经与组件所有者讨论了这一点,并添加了一个解决方法来创建该目录,当它不存在时,一切都很好。谢谢! – paulr 2009-12-18 18:02:04

1

您是否尝试将java.io.tmpdir设置为不同的场地,如讨论here

0

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

我有问题。奇怪的是,我的防病毒软件将jndispatch.dll文件检测为不洁文件并将其转存到其库中。
可能是内置的windows后卫正在做同样的事情。

结账!