我们有一个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相关的错误,但是如果我能弄明白它是什么呢是。任何建议都是最受欢迎的。
答案 0 :(得分:2)
您是否100%确定它正在写入您认为正在写作的位置?鉴于如果您修改程序以强制它写入那里并且它的工作原理听起来就像您正在尝试写入另一个目录。
答案 1 :(得分:1)
您是否尝试过将java.io.tmpdir
设置为其他地点,如here所述?
答案 2 :(得分:0)
由于以下原因,写入文件可能会失败:
1.用户权限/ s(继承被处理)。
2.腐败文件(已存在)。
3.文件被另一个应用程序同时访问
4.文件被反恶意软件/反病毒软件锁定。
退房!