アプリケーションの起動時にカスタムlog.properties
ファイルをロードしようとしています。
プロパティファイルはメインクラスと同じパッケージにあるため、-Djava.util.logging.config.file=log.properties
コマンドラインパラメーターでプロパティファイルをロードすると想定しました。
しかし、プロパティは、プロパティファイルへの完全な絶対パスを指定した場合にのみ読み込まれます。相対パスを使用する方法の提案はありますか?
Javaロギングは、ファイル全体をハードディスク全体で検索するわけではありません。ファイルの検索方法には非常に単純なルールがあります。 Javaで2つのファイルが互いに属していることを確認したいが、どこにも属していないことを確認したい。Javaはプロパティファイルとクラスがディスク上の同じフォルダにあること以外は、ファイルを見つけることができません。
-Djava.util.logging.config.file=log.properties
は、ファイルlog.properties
は、Javaプロセスの現在のディレクトリにあります(かなりランダムな場合があります)。したがって、ここでは絶対パスを使用する必要があります。
別の解決策は、ファイルを移動することですlogging.properties
から$Java_HOME/lib/
(またはそこにあるはずのファイルを編集します)。その場合、システムプロパティを設定する必要はありません。
動的にロードできますJava.util.logging
相対パスからのプロパティファイルは非常に簡単です。これはstatic {}
Main
クラスのブロック。あなたのlogging.properties
ファイルをdefault package
そして、次のコードで非常に簡単にアクセスできます。
final InputStream inputStream = Main.class.getResourceAsStream("/logging.properties");
try
{
LogManager.getLogManager().readConfiguration(inputStream);
}
catch (final IOException e)
{
Logger.getAnonymousLogger().severe("Could not load default logging.properties file");
Logger.getAnonymousLogger().severe(e.getMessage());
}
util loggingはクラスパスから読み込まれません。絶対パスが必要なため、log4jなどの他のロギングパッケージは設定がはるかに簡単で、absパスを取得するのが面倒なWebアプリに適しています。
これは、Java.util.logging.LogManager docoではまったく説明されていません。