web-dev-qa-db-fra.com

Concernant le fichier application.properties et la variable d'environnement

Java reconnaît avec succès le chemin d'accès dans mon fichier application.properties lorsque le chemin d'accès est configuré comme ci-dessous:

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

Si j'essaie d'utiliser une variable d'environnement, le programme Java ne reconnaît pas le chemin.

(la variable environnementale TOM_DATA est défini comme/kcs.)

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

Puis-je utiliser une variable d'environnement dans le fichier application.properties?

29
Arav

Vous pouvez placer des variables d'environnement dans votre fichier de propriétés, mais Java ne les reconnaîtra pas automatiquement comme variables d'environnement et ne les résoudra donc pas.

Pour ce faire , vous devrez analyser les valeurs et résoudre toutes les variables d'environnement que vous trouverez.

Vous pouvez accéder aux variables d'environnement à partir de Java en utilisant diverses méthodes. Par exemple: Map<String, String> env = System.getenv();

Il y a un tutoriel de base ici: http://Java.Sun.com/docs/books/tutorial/essential/environment/env.html

J'espère que cela vous sera utile.

19
Tom Duckering

La réponse de Tom Duckering est correcte. Java ne gère pas cela pour vous.

Voici du code utilisant des expressions régulières que j'ai écrites pour gérer la substitution de variables d'environnement:

/*
 * 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

C'est vrai. Java ne gère pas la substitution de la valeur des variables d'environnement. De même Java peut ne pas reconnaître des variables comme $ EXT_DIR. Lors de l'utilisation de telles variables que vous pourriez rencontrer FileNotFoundException . Mais Java reconnaîtra les variables définies avec - D dans catalina.sh . Ce que je veux dire par là, c'est que vous avez une telle définition dans catalina.sh

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

Dans votre fichier de propriétés, utilisez $ {web.external.dir} au lieu d'utiliser * $ EXT_DIR *. Et tout en accédant à cette propriété dans votre code, vous pouvez le faire de cette façon:

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

J'espère que cela aidera beaucoup de gens afin qu'ils n'aient pas à choisir des morceaux de partout, ce qui prend très longtemps pour résoudre un problème.

12
user2514836

Jetez un oeil à configuration Commons

Vous pouvez également utiliser des chemins relatifs dans votre fichier de propriétés et charger le répertoire de base via la ligne de commande en tant que propriété système. De cette façon, les fichiers de propriétés restent indépendants de l'endroit où l'application est réellement déployée.

6
objects

Le projet Apache Commons a étendu la gestion des fichiers de propriétés qui vous permet de tiliser les variables d'environnement (voir la section Interprétation des variables). Ensuite, vous devriez pouvoir obtenir ce que vous voulez en utilisant:

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