3

WindowsマシンでSYSTEMとして実行されるコンポーネントを含むJavaアプリケーションがあります。Windows 7 x64では、jnidispatchライブラリを解凍しようとすると1つのコンポーネントが失敗します。

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}を使用して、システムライブラリパスからロードしようとします。見つからない場合は、適切なライブラリがクラスパスから一時ディレクトリに抽出され、そこからロードされます。

OK、これまでのところ順調です。Javaは、java.io.tmpdirが指すものにjnidispatch.dllを解凍しようとしています。問題は、java.io.tmpdirがその特定のプロセスのC:\ Windows \ system32 \ config \ systemprofile \ AppData \ Local \Temp\を指していることのようです。このディレクトリが存在し、SYSTEMがフルコントロールを持っています。ただし、そのディレクトリへのjnidispatchDLLの抽出は常に失敗します。同じディレクトリにファイルを手動で書き込むようにアプリのコードを変更すると、書き込みは成功します。

関連するJavaおよびJDKコードを調べたところ、明らかな誤動作は見られなかったため、これはWin7 UACに関連する奇妙なバグであると結論付ける必要がありますが、それが何であるかを理解できれば気になります。どんな提案でも大歓迎です。

4

3 に答える 3

2

ここでjava.io.tmpdir説明するように、別の会場に設定してみましたか?ここここに記載されているように、Java仮想マシンの起動時に使用されるデフォルトを変更できます。createTempFile()

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

このアプローチは潜在的に安全ではなく、ホストプラットフォーム固有であるため、たとえば、実際の問題を追跡しているときにのみ使用する必要があります。

于 2009-12-18T03:07:28.103 に答える
2

あなたはそれがあなたが書いていると思うところにそれが書いていることを100%確信していますか?プログラムを変更して強制的にそこに書き込むようにすると、別のディレクトリに書き込もうとしているように聞こえます。

于 2009-12-18T03:09:04.407 に答える
0

次の理由により、ファイルの書き込みが失敗する可能性があります
。1.ユーザー権限/秒(継承が手動で処理される)。
2.破損したファイル(すでに存在します)。
3.同時に別のアプリケーションからアクセスされているファイル。
4.マルウェア対策/ウイルス対策ソフトウェアによってファイルがロックされています。

私は問題を抱えていました。奇妙なことに、私のアンチウイルスはjndispatch.dllファイルを汚れたファイルとして検出し、ボールトにダンプしました。
作り付けのウィンドウズディフェンダーが同じことをすることかもしれません。

チェックアウト!

于 2016-01-27T16:26:52.943 に答える