3

私はこの奇妙な問題に直面しています。

共有リソースとして別のマシンにあるファイルを読み込もうとしています:

\\remote-machine\dir\MyFileHere.txt

スタンドアロン アプリケーション (16 行の Java ファイル) を実行すると、問題なく動作します。しかし、サーバー「エンジン」から同じクラスと同じメソッドを使用して同じファイルを読み込もうとすると、「FileNotFoundException」が「FileNotFoundException」投げられます。

私はある種のアクセス許可になると思ったので、リソースをドライブとしてマップします: K:\

私のJavaファイルを再実行してください。読み取り、問題ありません。

「エンジン」内でJavaファイルを再実行します-> FileNotFoundException。

ファイルをローカル マシン ( C:\MyFileHere.txt ) にコピーすると、例外はスローされません。

質問

この FileNotFoundExcecption の原因は何ですか?

私はJava 1.5を使用しています

私の知る限り、このエンジンは Java をほとんど透過的に使用しています。

誰かが似たようなことに直面したことがありますか?

追加の質問ですか?これを回避するための良いアプローチは何でしょうか? これらのファイルを提供するTomcatのインストールについて考え始め、httpを介してそれらを読み取りますが、それは多すぎると思います. とにかく、私はソケットを開くことができないでしょう。

セキュリティマネージャーが原因である可能性があります(これまで使用したことはありませんが、存在することは知っています)

その場合、代わりに SecurityException がスローされませんか?

どうもありがとう。

編集

解決しました。スティーブ W さん、ありがとうございます。

このエンジンはZeroGの「LaunchAnywhere」で起動していることが判明。そのため、指定されたアプリで JVM を実行する .exe が作成されます。

このアプリケーション自体がランチャーです。エンジンを起動すると、どういうわけか(理由や方法がわかりません)JVMプロセスを所有するユーザーはSYSTEMです。Steve が指摘したように、このユーザーには NETWORK アクセス権がないため、共有リソースまたはマップされたドライブから読み取ることができません。

回避策 (メーカーに報告中) は、エンジンを手動で起動する .cmd ファイルを作成することです。手動で起動されるため、ユーザーはネットワークにアクセスできます。

SysInternals の「Process Explorer」を使用して、エンジン アプリの実行に使用されるコマンド ラインを正確に把握しました。

何という混乱!

回答を投稿してくれた人に感謝します。

4

4 に答える 4

6

共有リソースはユーザー名とパスワードで保護されていますか? その場合、アプリケーション エンジンはそのユーザーとして実行されていますか? アプリケーション エンジンが Windows サービスとして実行されている場合、Windows サービスを「ローカル システム アカウント」として実行することはできません。このアカウントはネットワークにアクセスできません。共有ドライブへのアクセス権を持つユーザーとして実行するようにサービスを構成する必要があります。

于 2009-01-28T04:43:52.653 に答える
0

サーバーのイベント ログをチェックして、サーバーが拒否されているかどうかを確認しましたか? 考えているユーザー アカウントとは異なるユーザー アカウントでプログラムが実行されている可能性があります。

私は Java に精通していませんが、私が作成したいくつかのプログラムでは、Network Service がリソースにアクセスできるようにする必要があることを知っています。

実際、あなたは正しい答えとしてチェックを入れているようです。ああ、それは私の答えと同じでした:)クール!

于 2009-01-28T06:28:06.577 に答える
0

私はかつて同様の問題を抱えていました。JavaがリモートファイルのURIを解決する方法に関係していると思います。以下を試して、動作するかどうかを確認してください。

File:////remote-machine/dir/MyFileHere.txt

次の例を使用して、ボックス内の共有フォルダーにファイルが存在することを確認し、機能しました。

public static void main(String[] args) throws URISyntaxException{
    URI uri = new URI(args[0]); //args[0] = File:////remote-machine/dir/MyFileHere.txt
    File f = new File(uri);
    System.out.print(String.format("File %1$s Exists? %2$s", args[0],f.exists()));
}
于 2009-01-28T06:38:44.730 に答える
0

ファイルの名前が「MyFileHere.txt.txt」ではなく「MyFileHere.txt」であることを再確認してください。ファイルの拡張子を隠している場合、これは見落としがちな間違いです。

于 2009-01-28T05:03:09.587 に答える