web-dev-qa-db-ja.com

application.propertiesファイルと環境変数について

次のようにパスを設定すると、Javaはapplication.propertiesファイルのパスを正常に認識します。

pathToInputFile=/kcs/data/incoming/ready/
pathToInputFileProcess=/kcs/data/incoming/work/

環境変数を使用しようとすると、Javaプログラムはパスを認識しません。

(環境変数TOM_DATAは/ kcsとして設定されます。

pathToInputFile=${TOM_DATA}/data/incoming/ready/
pathToInputFileProcess=${TOM_DATA}/data/incoming/work/

Application.propertiesファイル内で環境変数を使用できますか?

29
Arav

プロパティファイルに環境変数を入れることはできますが、Javaはそれらを環境変数として自動的に認識しないため、それらを解決しません。

これを行うには、you値を解析し、見つかった環境変数を解決する必要があります。

環境変数は、Java)からさまざまなメソッドを使用して取得できます。例:Map<String, String> env = System.getenv();

ここに基本的なチュートリアルがあります: http://Java.Sun.com/docs/books/tutorial/essential/environment/env.html

それが助けになることを願っています。

19
Tom Duckering

トム・ダッカリングの答えは正しいです。 Javaはこれを処理しません。

環境変数の置換を処理するために作成した正規表現を利用したコードを次に示します。

/*
 * Returns input string with environment variable references expanded, e.g. $SOME_VAR or ${SOME_VAR}
 */
private String resolveEnvVars(String input)
{
    if (null == input)
    {
        return null;
    }
    // match ${ENV_VAR_NAME} or $ENV_VAR_NAME
    Pattern p = Pattern.compile("\\$\\{(\\w+)\\}|\\$(\\w+)");
    Matcher m = p.matcher(input); // get a matcher object
    StringBuffer sb = new StringBuffer();
    while(m.find()){
        String envVarName = null == m.group(1) ? m.group(2) : m.group(1);
        String envVarValue = System.getenv(envVarName);
        m.appendReplacement(sb, null == envVarValue ? "" : envVarValue);
    }
    m.appendTail(sb);
    return sb.toString();
}
15
Tim Lewis

そうです。 Javaは、環境変数の値の置換を処理しません。また、Javaは$ EXT_DIRなどの変数を認識しない場合があります。このような変数を使用しているときに、FileNotFoundExceptionが発生する可能性があります。ただし、Javaは、-Dcatalina.sh。これが意味することは、catalina.shにそのような定義があるとします

CATALINA_OPTS="-Dweb.external.dir="$EXT_DIR"

プロパティファイルで$ {web.external.dir}を使用する代わりに* $ EXT_DIR *。そして、コードでこのプロパティにアクセスしているときに、次のようにできます。

String webExtDir = System.getProperty("web.external.dir");

これが多くの人々の助けになることを願っています。そうすれば、手元の問題を解決するのに本当に時間がかかる、あらゆる場所から断片を選ぶ必要がなくなるでしょう。

12
user2514836

Commons configuration をご覧ください

または、プロパティファイルで相対パスを使用し、コマンドライン経由でシステムプロパティとしてベースディレクトリをロードします。このようにして、プロパティファイルは、アプリケーションが実際にデプロイされている場所に依存しません。

6
objects

Apache Commonsプロジェクトでは、 環境変数を使用 を使用できるプロパティファイルの処理が拡張されています(「変数の解釈」セクションを参照)。その後、使用して欲しいものを取得できるはずです:

pathToInputFile=${env:TOM_DATA}/data/incoming/ready/
5
kc2001