3

System.getProperties("user.dir") を使用してプロパティ ファイルの場所を取得しています。Tomcat に (サーブレット経由で) デプロイされたので、システム コールは、プロパティ ファイルが存在する場所ではなく、Tomcat として場所を指定しています。

プロパティ ファイルを動的に呼び出す方法を教えてください。

与えられた:

  • アプリをデプロイする方法は Tomcat だけではありません
  • アプリが配置される場所を制御することはできません。
  • その Vista が使用されており、Vista が相対パスを壊しているため、相対パスは機能しません。
  • これは、Linux、XP、Vista を含む (ただしこれらに限定されない) すべての OS で動作する必要があります。
  • 編集私はこれを暗示しましたが、十分に明確でない場合、パス文字列を知る方法がありません。
4

9 に答える 9

2

ServletContextgetResourceおよびgetResourceAsStreamメソッドを見てください。

于 2009-02-17T20:13:00.240 に答える
2

プロパティ ファイルのパスを知る方法が必要です。これを File にラップして、プロパティ オブジェクトの load() メソッドに渡すことができます。

インストールしたユーザーとして実行していないTomcatサービス内で実行する場合、ホームディレクトリを取得できません。その場合、おそらく何かをハードコーディングする必要があります。


編集:プロパティファイルはアプリケーションに関連しています。特定のクラスのバイトコードのファイル名を取得する方法の例については、http://www.exampledepot.com/egs/java.lang/ClassOrigin.htmlを参照してください。そこから続けられるはずです。

Class cls = this.getClass();
ProtectionDomain pDomain = cls.getProtectionDomain();
CodeSource cSource = pDomain.getCodeSource();
URL loc = cSource.getLocation();  // file:/c:/almanac14/examples/

一部のセキュリティ管理者はこれを許可していないことに注意してください。

于 2009-02-17T22:42:03.910 に答える
1

質問が正しいことを理解していれば、別の方法としてServletContext.getRealPath()、アプリで jsp または静的ファイルを呼び出し、結果からパスを取得することもできます。

これは、圧縮された war ファイルとしてではなく、「拡張」された webapp を意味しますが、ほとんどの appserver はそれを行います。

于 2009-03-25T08:40:50.370 に答える
1

ClassName.class.getResourceAsStream()がうまくいくと思います。そのメソッドのコメントはClassLoader.getResource()を示しており、クラスパスでファイルを指定する方法を示しています。

このようなものが動作するはずです:

InputStream foo = ClassName.class.getResourceAsStream("file.name");

file.name は、どこかのクラスパスのベースにあります。file.name が com.foo.bar パッケージにある場合、「/com/foo/bar/file.name」を使用します。

于 2009-02-17T21:48:15.457 に答える
0

別のアプローチは、-Dパラメーターを使用して変数値をJVMに渡すことです。そうすれば、コードを同じ変数名に結び付けて、起動時に異なる値を渡すことができます。これは試していませんが、startCatalinaスクリプトを変更して-DパラメーターをJVMに渡すと、Tomcatにデプロイされたアプリでも機能するはずです。

于 2009-02-17T22:05:24.870 に答える
0

プロパティ ファイルの場所を JNDI に保存できますか?

これは、Tomcat 間で移植可能であり、Java EE アプリケーション サーバーにも移植可能です。

于 2009-02-18T14:10:14.817 に答える
0

構成ファイルをクラスパス内に配置し、 Springs ClassPathResourceなどを介して参照することは可能ですか?

次のように使用できるはずです。

ClassPathResource foo = new ClassPathResource("file.name");

file.name は、次のような最下位レベルのクラスパスのどこかに存在します。

  • /webapps/WEB-INF/classes/
  • jar ファイルの 1 つのベース
于 2009-02-17T21:19:03.093 に答える
0

同じ要件がありました。これまでに機能した最も簡単な方法は、すでにロードしているプロパティ ファイルの 1 つに basedir プロパティを格納することでした。次に、getExternalDocPath(String path) のようなメソッドを定義します。

これにより、Tomcat のドックベースを拡張することができました (Tomcat 7 だけがサポートしていますか?)。Web 上で、Tomcat のドックベースを実際に拡張して複数のパスを許可するクラス、つまり「alpha;baker;charlie」を投稿した人がいます。

于 2011-03-19T13:55:34.557 に答える