- - PR -
Tomcatの起動方法の違いによるファイルへの参照の成否
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 2004-02-27 15:37
現在、Servlet&JSP で Webアプリを作成しています。
そのうちの1機能としてファイルサーバに格納されている ワードやエクセルのドキュメントをWebサーバにコピーして、 クライアントにダウンロードさせるものを作りました。 (ダウンロード後、Webサーバにコピーしたファイルは削除します) Servletでファイルサーバのファイル格納先のディレクトリを指定しているのですが、 これが Tomcat の起動状態によって異なる動作をするので困っています。 使用環境は Webサーバ ・OS Win2000 Server ・コンテナ Tomcat 4.1.2 ・JDK jdk 1.4.1_02 ファイルサーバ ・OS Win2000 Server です。 問題の動作なんですが、 Tomcat を Start Tomcat のスクリプトから起動している状態では、 ファイルサーバのファイル格納先のディレクトリを参照できるのに対して、 Tomcat をサービス化して自動開始している状態では同じディレクトリが参照できなくなる。 と、いうものです。 (Tomcatのインストール時に"NT Service"にチェックを入れるか入れないかの違いです) なんとかTomcat をサービス化して自動開始している状態で、ファイルサーバのファイルを 参照したいのですが、何をどのようにカスタマイズすれば良いのでしょうか? 同じ様な現象、または似た現象を経験された方がおられましたら ご教授願います。 よろしくお願いいたします。 |
|
投稿日時: 2004-02-27 20:26
パスを相対指定していれば違うでしょうけど、絶対指定なら同じになりませんか?
それよりもしファイルとしてコピーしているのでしたら、同時にアクセスに来たと きに大丈夫ですか? |
|
投稿日時: 2004-02-27 20:35
getReqlPath で保存先を決めてみてはいかがでしょうか?
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletContext.html#getRealPath(java.lang.String) |
|
投稿日時: 2004-02-28 18:05
とりあえず思いついたのは以下の二つぐらいです。
推測1: 「Start Tomcat」を行うときにログオンしているユーザと、Apache Tomcat サービスの実行ユーザが違って、後者にはファイルサーバへのアクセス権がない。 推測2: 実はファイルサーバには、ログオン時に接続されるネットワークドライブを経由してアクセスしている(この場合、サービスからはそのネットワークドライブが当然見えないのでアクセスできないでしょう) |
|
投稿日時: 2004-02-29 15:07
返信が遅くなってしまい、申し訳ありません。
共有フォルダの設定についての詳細が抜けていました。 申し訳ありません。 ファイルサーバ上にあるフォルダを隠しフォルダとして共有しています。 (フォルダのプロパティの共有タグの"このフォルダを共有する"にチェックを付け共有名の接尾語に $ を付けます) そうすると、Windowsの通常のネットワークからはフォルダは見ることはできませんが、 「\\ファイルサーバー名 + \ + 共有フォルダ名 + $」をアドレスに直に記述したら見れますよね? それで、ひとまずの不正アクセスの対応としています。 (将来的に参照できるユーザーを設定しての対応は行う予定です) まず、ファイルサーバへのアクセスパスですが、 java のソース上でも上記と同様のパスを書いています。 ---ソース--- //ファイルサーバの共有フォルダにあるファイルをすべて、Webサーバの一時保存領域にコピーする処理 String fromDirName = "//ファイルサーバー名 + / + 共有フォルダ名 + $" String toDirName = "D:/temp" File dir = new File( fromDirName ); //ディレクトリを指定 String ls[] = dir.list(); //取得したディレクトリを配列に Arrays.sort(ls); //ソート処理を行う InputStream fromStream; // 入力ファイルストリーム・オブジェクト OutputStream toStream; // 出力ファイルストリーム・オブジェクト //ディレクトリの中身をファイル数分処理する for ( int i=0; i < ls.length; i++ ) { currentFile = ls[i]; //ファイルが適切でない場合は処理を行わない if (!new File(fromDirName, currentFile).isFile()) continue; // 複写元のファイルを開く fromStream = new FileInputStream(currentFile); String toFile = toDirName + "/" + currentFile; // 複写先のファイルを開く toStream = new FileOutputStream(toFile); // 複写を行なう while ((rcount = fromStream.read(buffer)) >= 0){ toStream.write(buffer, 0, rcount); } } // 複写元のファイルを閉じる fromStream.close(); // 複写先のファイルを閉じる toStream.close(); ------------ Start Tomcat での起動の場合ですと、うまく処理は流れるのですが サービス化しての Tomcat 自動起動ですと、ソート処理を行うところで、 ls[] が null であるという「NullPointerException」で落ちてしまいます。 このようなパス指定の仕方は、aaさんのおっしゃる"絶対パス"になるのでしょうか? そもそもこのようなパス指定は良いのでしょうか? 今更なのですが、素人な質問ですいません。 また、Webサーバの一時保存領域を指定する場合の Dドライブ を直接指定するのは 非常に違和感がありましたので、インギさんの返信にもありました getReqlPath で保存先を決定することにいたします。 どうもありがとうございます。 そしてアクセス権のお話ですが、状況をご説明させていただきます。 現在、二つのPCを使って開発を行っております。 ひとつはTomcatのインストール時に"NT Service"にチェックを入れていないPC (開発用として Start Tomcat での起動をしています) もうひとつはTomcatのインストール時に"NT Service"にチェックを入れているPC (テストサーバー用として サービス化しての 自動Tomcat 起動) 前者で開発を行い、後者のPCに移行し、本番環境としてテストを行います。 どちらもWindowsのネットワーク上から、ファイルサーバのファイルはアドレス直接指定で見れます。 やはりサさんの推測1がおっしゃる通り、Tomcatのアクセス権が関係しているようです。 サービスのプロパティのログオンタブのローカルシステムアカウントあたりの 設定のような気がするのですが、何をどのようにしたら良いのか見当がつきません。 現在はまだ原因を追求している状況です。 どんな些細なことでも結構ですので、情報がありましたらよろしくお願いいたします。 なにかわかりましたら、また投稿させて頂きます。 |
|
投稿日時: 2004-03-01 11:12
NTのサービスだと、デフォルトでは起動アカウントがSYSTEMアカウントになると思います。
SYSTEMアカウントだとそのディレクトリが参照できないということはないでしょうか。 サービスのアカウント指定を例えばAdministratorに設定して再起動してみてはどうでしょうか。 |
|
投稿日時: 2004-03-01 11:22
追加です。ファイルサーバ上のフォルダということは、NTドメインで管理されているアカウント
しかアクセスできないということはないでしょうか。であれば、サービスのアカウントにその ドメインのアカウントを設定する必要があります。 |
|
投稿日時: 2004-03-01 14:50
ukさん
返信ありがとうございます。 無事にファイルの参照ができました!! ありがとうございます。 以下の通りに対応しました。 まず初めは、サービスのアカウント指定を Administrator にしてやってみました。 しかしこれではサーバに対してのアクセス権が無いようで、ファイルの参照は行えませんでした。 次に、サービスのアカウント指定を NTドメインで管理されているアカウントに 設定してサービスを再起動しました。 そうすると、うまくファイルの参照が行えました。 ukさんのおっしゃる通り、サービスのアカウント指定が問題だったようです。 どうもありがとうございました。 返信を下さった皆様もどうもありがとうございました。 今後ともよろしくお願いいたします。 |
1
