У нас есть приложение Java, которое включает в себя компоненты, которые работают как системы на компьютерах с Windows. В 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)
Ниже скопирован фрагмент комментариев из класса Native от jna.
библиотека:
Когда классы JNA загружены, собственная общая библиотека (jnidispatch)
загружен также. Предпринята попытка загрузить его из пути к системной библиотеке.
используя {@link System # loadLibrary}. Если не найден, соответствующая библиотека
будет извлечен из пути к классу во временный каталог и
загружен оттуда.
Хорошо, пока все хорошо: Java пытается распаковать jnidispatch.dll во все, на что указывает java.io.tmpdir. Кажется, проблема в том, что java.io.tmpdir указывает на C: \ Windows \ system32 \ config \ systemprofile \ AppData \ Local \ Temp \ для этого конкретного процесса. Этот каталог существует, и СИСТЕМА имеет полный доступ. Однако извлечение библиотеки DLL jnidispatch в этот каталог всегда завершается неудачей. Если я изменю код в нашем приложении, чтобы вручную записывать файлы в этот же каталог, запись будет успешной.
Я просмотрел соответствующий код Java и JDK и не вижу явного неправильного поведения, поэтому вынужден сделать вывод, что это какая-то странная ошибка, связанная с UAC в Win7, но, черт возьми, могу ли я понять, что это является. Любые предложения будут приветствоваться.