web-dev-qa-db-ja.com

java)を使用してLinux環境からTomcatの現在のディレクトリの相対パスを取得する方法

Webアプリケーションの外部からプロパティファイルを読み取るために使用したいと思います。 Windows環境のTomcatにwarファイルをデプロイしました。次のコードを使用して、Webアプリケーションの外部からプロパティファイルを読み取ることができます。

//(Method 1.)
String filePath = 
new Java.io.File( ".").getCanonicalPath()+"/webapps/strsproperties/strs.properties";
// or  
//(Method 2.)
String filePath = new File(System.getProperty("catalina.base"))+ "/webapps/strsproperties/strs.properties";

InputStream inputStream = null;
inputStream = new FileInputStream(filePath);
properties.load(inputStream);
String application = properties.getProperty("applications");

上記の両方の場合、WindowsでfilePathを読み取ることができます。

問題は、Linuxで1番目の方法(相対パス)プロセスを使用してfilePathを読み取れないことです。

Linux環境からTomcatの相対パスを使用してファイルを読み取る方法はありますか?.

7
asiam9

あなたの問題は、「現在の」ディレクトリが何であるかを知らないということです。 LinuxでTomcatをサービスとして起動する場合、現在のディレクトリは何でもかまいません。したがって、new File(".")は、ファイルシステム内のランダムな場所を取得します。

システムプロパティ_catalina.base_を使用すると、Tomcatの開始スクリプト_catalina.sh_がこのプロパティを設定するため、はるかに優れています。したがって、これは、別のサーバーでアプリを実行しようとしない限り機能します。

良いコードは次のようになります。

_File catalinaBase = new File( System.getProperty( "catalina.base" ) ).getAbsoluteFile();
File propertyFile = new File( catalinaBase, "webapps/strsproperties/strs.properties" );

InputStream inputStream = new FileInputStream( propertyFile );
_

ご覧のとおり、コードは文字列とファイルを混合していません。ファイルはファイルであり、文字列は単なるテキストです。コードにテキストを使用することは避けてください。

次に、getAbsoluteFile()を使用して、例外で有用なパスを取得できるようにします。

また、コードが例外を飲み込まないようにしてください。コードにエラーメッセージが表示されていたとしたら、コードが間違った場所を検索しようとしていることがすぐにわかります。

最後に、このアプローチは脆弱です。パスが変更された場合、別のWebサーバーが使用された場合、およびその他の多くの場合、アプリは壊れます。

Webapp strspropertiesを拡張してHTTPリクエストを受け入れることを検討してください。そうすれば、URLを介してstrspropertiesに接続するようにアプリを構成できます。これはどのWebサーバーでも機能し、プロパティを別のホストに配置することもできます。

25
Aaron Digulla

コードがサーブレット内で実行される場合は、getServletContext().getRealPath("/strs.properties")を使用して絶対ファイルパスを取得する方が簡単な場合があります。

3
David Levesque

これは、それを実行するための強力な方法ではありません。 Webアプリケーションで「外部」からのデータを消費する場合は、System.getPropertyを呼び出して、Tomcat構成スクリプトで-Dを使用して指定した絶対パス名を取得します。

1
bmargulies