- PR -

eclipseから起動したTomcat上でのパス指定

1
投稿者投稿内容
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2006-02-15 11:03
eclipseからTomcatを起動した場合のjavaプログラムからのFileクラスへのパス指定が
おもったようにいきません。


TOMCAT_HOME=C:\env\app1\app1
eclipseインストール c:\eclipse

Fileクラスのパス指定 "..\down\abc"
このパス指定でファイルを作成している。


C:\env\app1\app1\bin\startup.batから起動した場合に作成されるパス
C:\env\app1\app1\down\abc

eclipseプラグインから起動した場合に作成されるパス
C:\down\abc

と違った場所を指しています。

Windows環境では起動されたTomcatプロセスのカレントディレクトリは、
Tomcatを起動したexe,batがあるパスになっているので、Tomcatのjvmパラメータに
-Duser.dir=C:\env\app1\app1\bin
を指定し変更しましたが、これでもうまくいきません。

-Duser.dirを指定した場合、getAbsolutePath()で参照してみると、eclipseから起動した
場合も"C:\env\app1\app1\bin\..\down\abc"になっているにもかかわらず、作成される
パスは"C:\down\abc"はとなっています。

試しにjavaアプリケーションで

import java.io.*;

public class fi {
public static void main( String[] args ) {
try {

File fo = new File( args[0] );

System.out.println("getAbsolutePath()=" + fo.getAbsolutePath() );
FileOutputStream fs = new FileOutputStream( fo, false );
fs.write( "abc".getBytes() );
fs.close();
} catch ( Exception e ) {
e.printStackTrace();
}
}
}

を作成して
C:\直下から起動するテストをしました。

C:\>java -Duser.dir=c:\temp\xxx fi ..\yyy\test
getAbsolutePath()=c:\temp\xxx\..\yyy\test

C:\yyy>dir c:\yyy\test
2006/02/15 10:21 3 test

C:\yyy>dir c:\temp\yyy\test
ファイルが見つかりません

C:\yyy>dir c:\temp\xxx\..\yyy\test
ファイルが見つかりません

となります。
*dirコマンドが返すメッセージは省略しています。

getAbsolutePath()が返す位置にファイルができていないのは、Tomcatと直接関係ない
話なのですが、なんでだろう?
それはさておき
どこからTomcatを起動しても、TOMCAT_HOMEがどこであっても、そこからの相対パスで見
ると同じパスのファイルを指して欲しいのです。
eclipseからの起動にパラメータを指定するのはいいのですが、start.batやtomcat.exe,
tomcat5w.exeを直接起動した場合はパラメータは指定できません。

現状は、javaアプリ内で指定するパス指定をweb.xmlに設定する方法で対応していますが、
これは避けたいです。
なにかよい方法はないでしょうか?

環境
OS Windows XP
jdk 1.4.2_08
eclipse 3.0.1
Tomcat 5.5
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-02-15 11:09
ResourceBundleを使うかまたは自分で実装するかして、
外部のプロパティファイルに絶対パスを記述する方法がいいと思います。

<追記>
web.xmlに設定しているのか。
だったら同じ事ですね。m(_ _)m
ただ、私だったらデフォルトを当てにすることはしないです。

[ メッセージ編集済み 編集者: Edosson 編集日時 2006-02-15 11:48 ]
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2006-02-15 14:46
レスいただきましたが追記されてるとおり、別途絶対パスを定義するという方法はとり
たくありません。

ほかの事情も書くと
本番のTOMCAT_HOME=D:\Tomcat 本番機は別マシン
開発時のTOMCAT_HOME=C:\env\app1\app1
eclipseインストール c:\eclipse

それで
本番でも開発機でもServletから作成する業務ファイルが$TOMCAT_HOME/downにでき
ログが$TOMCAT_HOME/logsにできて欲しいのです。
こういった場合、本番と開発機で設定変更したりしてます?

私はサーブレットの開発は5つ目で、コンテナの環境まわりを担当するのは、初めてな
んですが、以前のプロジェクトでは本番機、開発機、テスト機とかに移行するのに、
気にしないでうまくいってたとおもったからです。

本番機、テスト機はUNIX系であったり、コンテナがTomcatでなかったり、開発環境が
eclipse以外だったりしますが、相対パス記述でTOMCAT_HOMEから同じ相対位置を指定
できてたとおもうし、変わってしまうのはメンテ上好ましくないので、質問を投稿
した次第です。

それと最初の投稿のとおり、getAbsolutePath()が返す位置にファイルができないのは
そういうもんなんでしょうか?
koe
大ベテラン
会議室デビュー日: 2003/07/13
投稿数: 198
投稿日時: 2006-02-16 00:16
Webアプリケーションで相対パスを使うことの是非は解りませんが、
Eclipseから起動するTomcatの作業ディレクトリを指定する方法ならわかります。
Sysdeo Tomcat Launcher Pluginを使っているのでしたら、
設定ダイアログの「Tomcat」>「JVMの設定」画面で
「新規の起動設定」ボタンをクリックすると、
Javaアプリケーションの起動構成としてTomcat用のものが作成されます。
作成された設定を開き「引数」タブの作業ディレクトリを指定すればよい…はずです。

WTPを使っている場合も一緒ですね。

ちなみにうちでは、そういった環境依存の設定は設定ファイルにまとめて、
Antで一括変換してます。ファイルのバージョン管理がちょっと面倒
(変換対象のファイル自体はバージョン管理できない)ですが、
代わりにconf/web.xmlとか別のファイルをバージョン管理して、
AntでWEB-INF/web.xmlにコピーしつつ環境依存のパスを書き換えるようにしています。

環境ごとの設定を個別にする必要があり、手間といえば手間ですが、
DB接続情報や連携するサーバのURLなど環境依存の項目が結構あり、
2つ3つ増えたところで大して手間は代わりませんでした。
それに一度設定してしまえば、後はAntで自動的に変わるので負担になりません。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-02-16 00:42
私の場合は、WEB-INF配下にターゲットのディレクトリを配置するようにし、
javax.servlet.ServletContext#getRealPath(String)を使用して、
相対パスから絶対パスを取得することが多いです。

getRealPathなら基点はアプリケーションルートになりますので、
String path = getServletContext().getRealPath("/WEB-INF/xxx.txt");
とすると、アプリケーションの配置しているディレクトリに関係なく、
WEB-INF配下の絶対パスを取得することが可能です。
(別にWEB-INF配下じゃなくてもいいのですが、ここなら外部から見えないので・・・)

読み込み専用のリソースであれば、クラスパス上に配置して、
クラスローダ経由で取得するのも便利です。
(WEB-INF/classes配下に配置)

参考までに・・・
progman
大ベテラン
会議室デビュー日: 2005/06/08
投稿数: 227
投稿日時: 2006-02-16 09:32
KOEさんの方法でうまくいきました。
どうも、ありがとうございます。

かつのりさんの方法は新規にこちらで作成するプログラムならいいのですが、既に作成
したロジックやパッケージのようなものを流用しているロジックも多いので、適用は
難しいとおもいます。
今後の参考にさせていただきます。

今のシステムでは環境依存のパラメータはDB関連設定とTomcat起動の-Mmxなどのパラ
メータだけです。
指摘されているように”それぐらい”というのはもっともだとおもうのですが、運用
まわりにかけられる人、工数が限られているので、少しでも単純にしたいとおもって
います。
1

スキルアップ/キャリアアップ(JOB@IT)