8

I would like to use to read properties file from out side of the my web application. I was deployed a war file in tomcat in windows environment and I am able to read properties file from outside of my web application using following code.

//(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");

In above both case's I am able to read filePath in windows.

Problem is I am not able to read filePath in Linux using 1st method ( relative path) process.

Is there any way to read file using relative path in tomcat from Linux env ?.

4

3 に答える 3

26

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

Tomcat の起動スクリプトがこのプロパティを設定するため、システム プロパティを使用するcatalina.base方がはるかに優れています。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 サーバーが使用された場合、およびその他の多くの場合、アプリが壊れます。

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

于 2012-10-12T08:35:19.110 に答える
3

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

于 2012-10-11T15:46:44.487 に答える
1

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

于 2012-10-11T16:13:06.237 に答える