コンテナーapplication.properties
を使用してサーブレット アプリケーションからファイルを読み取る必要があります。Tomcat
ファイルを my に含めるwar
ことはできないため、webapps またはTomcat
ルート フォルダーの下に置くことはできません。ファイルはフォルダー内のどこかにある必要があります。FileInputStream
プロパティファイルの読み取りにも使用できません。私が持っている唯一のオプションはJNDI
、フォルダー/ディレクトリの名前を定義し、JNDI
実行時にそのプロパティを調べて、ファイルを読み取るフォルダーの場所を見つけることです。そこに実例はありますか?
2 に答える
次の同様の投稿や記事を読んで、自分で解決策を見つけました。
JNDI を使用して tomcat からグローバル変数を読み取る。例が機能しない
次のように、\conf\Catalina\localhost\mywebapp.xml の下の Web アプリケーションのコンテキスト内に環境を定義しました....
<Environment name="propertiesfilelocation" value="E:\\tmp\\application.properties"
type="java.lang.String" override="false"/>
次に、JNDI ルックアップを使用してプロパティ ファイルにアクセスし、ファイル名を取得しました。
Context ctx = new InitialContext();
Context envCtx = (Context)ctx.lookup("java:comp/env");
String propertiesFileLocation = (String) envCtx.lookup("propertiesfilelocation");
LOGGER.info("String property === " + propertiesFileLocation);
properties.load(new FileInputStream(propertiesFileLocation));
@home : はい、そうです FileInputStream が関係しています。ただし、Java コード内にフォルダーの場所をハードコーディングする必要がなくなったため、このソリューションに満足しています。これにより、アプリの移植性が向上します。
私は同様の問題に対して少し異なるアプローチをしています。JNDI のアイデアも試してみましたが、これは少しやり過ぎであることがわかりました。
BalusC による別の記事を見つけました。Tomcat インストールに関連するフォルダーを指定し、そこにすべてのプロパティ ファイルをデプロイできます。したがって、構成はアプリケーションの外部に保持しますが、すべてのアプリのすべてのプロパティ ファイルに個別の構成は必要ありません。
ここにリンクがあります: サーブレットベースのアプリケーションで構成リソースファイルを配置する場所と読み取る方法は?
好ましい選択は次のとおりです。
ClassLoader#getResourceAsStream()
クラスパス相対パスでロードできるように、クラスパスに入れ ます。Properties properties = new Properties(); properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.properties"));
ここで
filename.properties
は、webapp のデフォルトのクラスパス (例:webapp/WEB-INF/lib
、webapp/WEB-INF/classes
、appserver/lib
または) によってカバーされるルートの 1 つに配置する必要がありますJRE/lib
。プロパティ ファイルが webapp 固有の場合は、.xml に配置するのが最適です
WEB-INF/classes
。IDE でプロジェクトを開発している場合は、プロジェクトを src フォルダー (プロジェクトのソース フォルダー) にドロップすることもできます。または、デフォルトのクラスパスの外に配置して、そのパスをアプリサーバーのクラスパスに追加することもできます。
shared.loader
たとえばTomcatでは、のプロパティ として構成できますtomcat/conf/catalina.properties
。
これが役立つことを願っています。
アラン