IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Comment récupérer la valeur d'une variable d'environnent


Sujet :

Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 55
    Points
    55
    Par défaut Comment récupérer la valeur d'une variable d'environnent
    Bonjour.

    Je souhaite récupérer une variable d'environnement système comme JAVA_HOME
    j'ai essayé System.getenv("JAVA_HOME"); et ça marche pas une erreur est levé
    getenv no longer supported, use properties and -D instead: JAVA_HOME

    pour System.getPropertie ça renvoie que les variable du RunTime


    Autre chose, j'utilise java 1.4
    Merci d'avance

  2. #2
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Allez, 2 solutions possibles mais il y a peut etre plus propre :
    1 - Executer la commande "echo %JAVA_HOME% et recuperer stdout.
    Mais je prefere :
    2 - Lancer l'executable avec un script qui ajoute la valeur de JAVA_HOME.

    Par exemple, si c'est un .bat :
    java -DJAVA_HOME=%JAVA_HOME% maClasse

    et tu recuperes la valeur de JAVA_HOME avec System.getProperty

    Comme ca, avec la 2e solution, il suffit de changer le script en fonction de l'OS mais le programme JAVA reste compatible et n'a pas besoin de savoir sur quelle plateforme il tourne.

    a+

  3. #3
    En attente de confirmation mail
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2010
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 501
    Points : 1 060
    Points
    1 060
    Par défaut
    Il existe deux méthodes getenv mais ni l'une ni l'autre ne semble dépréciée en java 1.6.

    J'ai une préférence pour la méthode System.getenv() qui retourne une Map<String,String>.
    http://download-llnw.oracle.com/java....html#getenv()

    Il faut faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String javaHomeValue = System.getenv().get("JAVA_HOME");

  4. #4
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 55
    Points
    55
    Par défaut
    Et comme précision ce n'est pas JAVA_HOME qui m'intéresse c'est d'autres variables d'env qui n'ont pas de relation avec Java. j'ai par exemple une variable qui stocke l'adresse du serveur de base de donnée

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Nudger Voir le message
    Il existe deux méthodes getenv mais ni l'une ni l'autre ne semble dépréciée en java 1.6.
    Mais System.getenv() était bien dépréciée en Java 1.4 (en fait depuis la version 1.2 ou 1.3 je ne suis plus sûr) pour des raisons assez idiotes en fait (Ce n'est pas portable car la casse n'est pas forcément prise en compte selon l'OS).
    Heureusement cela a été réintroduit dans Java 5.0...

    Le problème c'est qu'en plus d'être dépréciée, cette méthode renvoyait carrément une exception

    Une solution (pas top) serait de passer par une commande externe via Runtime.exec()... mais niveau portabilité c'est pas la joie


    a++

  6. #6
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    J'imagine que tu es sous windows. Si echo %JAVA_HOME% renvoie %JAVA_HOME%, c'est que la variable n'est pas connue.

    Pour etre sur, tu peux faire la commande "set" sans argument qui affiche la liste des variables d'environnement. Ensuite, il ne reste plus qu'à chercher...

    Cela dit, chez moi, ton code renvoie une exception. Pour le faire marcher, j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Process ps = Runtime.getRuntime().exec(
                   new String[] { "cmd",
                         "/C",
                         "echo",
                         "%JAVA_HOME%" });
    a+

  7. #7
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 55
    Points
    55
    Par défaut
    Et env ça marche bien sous linux comme sous windows

    Merci pour l'aide et je souhaite que ça aidera d'autres personnes

  8. #8
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 100
    Points : 55
    Points
    55
    Par défaut
    Voila la solution que j'ai. Merci pour votre aide, et j'espère que ça aidera d'autres personnes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Process ps = Runtime.getRuntime().exec("env");
    			BufferedReader reader = new BufferedReader(new InputStreamReader(ps.getInputStream()));
    			String line = "";
    			try {
    				while((line = reader.readLine()) != null) {
    					if(line.startsWith("JAVA_HOME")){
    						javahome= line.split("=")[1];
    					}
     
    				}
    			} finally {
    				reader.close();
    			}

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Bien vu pour env en plus cela a l'air bien plus portable
    Perso j'aurais plutôt pensé à un echo

    A noter quand même qu'il est préférable de fermer les autres flux du process.
    De même du coup on pourrait imaginer de charger toutes les variables d'environnement directement dans un Properties :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
        public static Properties getenv() throws IOException {
            Process process = Runtime.getRuntime().exec("env");
            try {
                process.getOutputStream().close();
                process.getErrorStream().close();
     
                Properties env = new Properties();
                InputStream input = process.getInputStream();
                try {
                    env.load(input);
                } finally {
                    input.close();
                }
                return env;
            } finally {
                process.destroy();
            }
        }

    a++

  10. #10
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    env marche sous windows ??? Pour moi, c'est une commande linux dont l'equivalent est set...

  11. #11
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    env marche sous windows ??? Pour moi, c'est une commande linux dont l'equivalent est set...
    Arghh!!! Autant pour moi ! En fait j'utilise "msys" qui intègre une commande env sous Windows... Du coup ça marchait


    Le problème en utilisant set, c'est que c'est une commande interne du shell... et ce dernier est différent selon les versions de Windows (cmd.exe ou command.com sous les anciens Windows).


    Du coup ça donnerait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
        public static Properties getenv() throws IOException {
     
            final String osName = System.getProperty("os.name");
            final String[] command;
     
            if (osName.indexOf("Windows")>=0) {
                if (osName.indexOf("Windows 3")>=0
                 || osName.indexOf("Windows 9")>=0
                 || osName.indexOf("Windows ME")>=0) {
                    // Windows 3.x, 9x, ME :
                    command = new String[] { "command.com", "/C", "set" };
                } else {
                    // Windows NT, 2000, XP, Vista, Seven
                    command = new String[] { "cmd.exe", "/C", "set" };
                }
            } else {
                // Autres systèmes :
                command = new String[] { "env" };
            }
     
            Process process = Runtime.getRuntime().exec(command);
            try {
                process.getOutputStream().close();
                process.getErrorStream().close();
     
                Properties env = new Properties();
                InputStream input = process.getInputStream();
                try {
                    env.load(input);
                } finally {
                    input.close();
                }
                return env;
            } finally {
                process.destroy();
            }
        }

    Bon je l'accorde le support de Windows 3.1/9x/ME ne doit pas intéresser grand monde... mais quand même

    a++

    PS : C'était vraiment une idée à la con de "tuer" System.getenv()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. comment récupérer la valeur d'une variable ATL?
    Par hanane1986 dans le forum ALM
    Réponses: 1
    Dernier message: 07/07/2010, 15h23
  2. Réponses: 1
    Dernier message: 18/09/2007, 16h07
  3. Réponses: 8
    Dernier message: 02/10/2006, 17h16
  4. Récupérer la valeur d'une variable d'environnement
    Par poca10 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/02/2006, 10h23
  5. Réponses: 1
    Dernier message: 21/11/2005, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo