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

API standards et tierces Java Discussion :

[Systeme][unix]récupérer une variable


Sujet :

API standards et tierces Java

  1. #1
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut [Systeme][unix]récupérer une variable
    Salut,

    Je bosse actuellement sur plusieurs serveurs Oracle et j'aimerai pouvoir récupérer le contenu de la variable $ORACLE_HOME qui diffère selon les serveurs.
    Je sais que créer un fichier en faisant par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    File f=new File("$ORACLE_HOME/monFichier.ext");
    ne fonctionne pas, et ce parceque j'ai testé.
    Comment alors récupérer le contenu de ma variable $ORACLE_HOME ?

    merci

    Fred

  2. #2
    Membre expérimenté
    Inscrit en
    Juillet 2004
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 152
    Par défaut
    elle n'apparait pas dans System.getProperties().propertyNames() ?

    sinon, la solution est peut etre de lancer ta JVM avec une option -Doracle.home=$ORACLE_HOME

  3. #3
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.getProperty("$ORACLE_HOME")
    m'affiche null.

    Je ne peux pas lancer ma JVM ainsi, je ne suis que stagiaire, et ce serait trop lourd à configurer pour un simple logger

    Fred

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2003
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 159
    Par défaut
    Il ne faut pas que tu mettes le $ devant ton nom de varaible.
    Essaie juste un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.getProperty("ORACLE_HOME")

  5. #5
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    idem, renvoie null ^^

    Citation Envoyé par unix
    [oapcp00@l155902obsias logs]$ echo $ORACLE_HOME
    /oracleas/0904/oapcp00
    Fred

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    System.getProperty() ne permet pas de récupérer les variables d'environnements, mais seulement les valeurs passé avec l'option -D de java (en plus d'un certain nombre de valeurs prédéfini).

    La seule solution portable est d'utiliser System.getenv() mais à partir de Java 5.0 seulement...

    Sinon tu peux te débrouiller en appellant le shell du système, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Process p = Runtime.getRuntime.exec(new String[]{"sh", "-c", "echo $ORACLE_HOME"});
     
    // lecture de l'output du process...
    a++

  7. #7
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    ok merci je teste ca demain

    Fred

  8. #8
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Salut,

    Au boulot on tourne sous Java 4 (norme nationnale, pas le choix), pour quelle raison http://javasearch.developpez.com/j2s...a.lang.String) est il deprecated en 1.4 et pas en 1.5 ?
    Ca m'intrigue parceque généralement c'est l'inverse qui se produit.

    Merci

    Fred

  9. #9
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Il est revenu sous la pression de nombreux utilisateurs fâchés que System.getenv() fut simplement mis de côté.

    Java 1.3 System.getenv() déprécié
    Java 1.4 System.getenv() déprécié
    Java 1.5 System.getenv() est de nouveau là

  10. #10
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    han ... du coup je dois me rabattre sur les process, voici ce que je fais :
    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
     
    Process p=null;
    String s=null;
    try
    {
    	p = Runtime.getRuntime().exec(new String[]{"sh","-c","echo", "$ORACLE_HOME"});
    	p.waitFor();
    	InputStream i=p.getInputStream();
    	byte[] b=new byte[0];
    	i.read(b);
    	s=new String(b);
    	System.out.println(b.length);
    }catch(Exception e)
    {
    }
    System.out.println(s);
    Et voici ce que ca me renvoie :
    0
    Avec echo $ORACLE_HOME même résultat..
    hum, j'ai du rater quelque chose, faut dire que les io c'est pas trop mon truc

    Fred

  11. #11
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    getenv() a été déprécié car il n'est pas si portable que ca : selon les systèmes d'exploitations la gestion est différente. En particulier au niveau de la gestion de la casse majuscule/minuscule...

    Afin d'uniformiser cela, il a été conseillé d'utiliser à la place System.gerProperty() et la fameuse option -D, qui garantit un fonctionnement identique quel que soit le système d'exploitation...

    Il se trouve que le "remêde" est pire que le "mal", surtout si l'on doit utiliser beaucoups de variables d'environnements puisqu'il faudrait toutes les passer sur la ligne de commande... Ainsi la méthode getenv() a été réintroduite dans Java 5.0...



    Donc comme solution il te reste :
    • Utiliser Runtime pour lancer un shell qui te donnera la valeur de la propriété
    • Utiliser une méthode native qui effectuera un appel système vers getenv()
    a++

  12. #12
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mavina
    hum, j'ai du rater quelque chose, faut dire que les io c'est pas trop mon truc
    Oui : tu utilises un buffer de taille 0 pour la lecture : tu ne risques pas de lire grand chose...



    Tu peux utiliser cette méthode pour lire complètement un InputStream en String :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static String toString(InputStream stream) throws IOException {
        byte[] buf = new byte[256];
        StringBuffer buffer = new StringBuffer();
        int len;
     
        while ( (len=stream.read(buf)) > 0 ) {
            buffer.append( new String(buf, 0, len) );
        }
        return buffer.toString();
    }
    Enfin je te conseillerais de fermer les flux que tu n'utilises pas, et de placer ton waitFor() après avoir fermé tous les flux (sinon tu risque de bloquer les deux process, car si tu ne lis pas les flux et qu'ils ne sont pas fermés, le process peut être bloqué en attendant que tu les consommes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    p = Runtime.getRuntime().exec(new String[]{"sh","-c","echo", "$ORACLE_HOME"});
    p.getOutputStream().close();
    p.getErrorStream().close();
    InputStream i=p.getInputStream();
    try {
        s = toString(i);
    } finally {
        i.close();
    }
    p.waitFor();
    a++

  13. #13
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Citation Envoyé par adiGuba
    Oui : tu utilises un buffer de taille 0 pour la lecture : tu ne risques pas de lire grand chose...
    Alors en fait je pensais que le buffer était redimensionné automatiquement... Quelle naiveté, c'est même pas écrit (certaines fonctions des collections le font, donc je m'étais dit que... ).

    Citation Envoyé par adiGuba
    Tu peux utiliser cette méthode pour lire complètement un InputStream en String :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static String toString(InputStream stream) throws IOException {
        byte[] buf = new byte[256];
        StringBuffer buffer = new StringBuffer();
        int len;
     
        while ( (len=stream.read(buf)) > 0 ) {
            buffer.append( new String(buf, 0, len) );
        }
        return buffer.toString();
    }
    Enfin je te conseillerais de fermer les flux que tu n'utilises pas, et de placer ton waitFor() après avoir fermé tous les flux (sinon tu risque de bloquer les deux process, car si tu ne lis pas les flux et qu'ils ne sont pas fermés, le process peut être bloqué en attendant que tu les consommes) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    p = Runtime.getRuntime().exec(new String[]{"sh","-c","echo", "$ORACLE_HOME"});
    p.getOutputStream().close();
    p.getErrorStream().close();
    InputStream i=p.getInputStream();
    try {
        s = toString(i);
    } finally {
        i.close();
    }
    p.waitFor();
    a++
    Je teste ça

    Fred

  14. #14
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Je te la donne en mille : ca marche pas

    voici la classe que j'ai faite :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    import java.io.*;
     
    public class Test
    {
     
    	public static String toString(InputStream stream) throws IOException 
    	{
        		byte[] buf = new byte[256];
        		StringBuffer buffer = new StringBuffer();
        		int len;
     
    	    	while ( (len=stream.read(buf)) > 0 ) 
    		{
    	        	buffer.append( new String(buf, 0, len) );
    	    	}
    	    	return buffer.toString();
    	}	
    	public static void main(String[]args)
    	{
    		Process p=null;
    		String s=null;
    		InputStream i=null;
     
    		try
    		{
    			p = Runtime.getRuntime().exec(new String[]{"sh","-c","echo", "$ORACLE_HOME"});
    			p.getOutputStream().close();
    			p.getErrorStream().close();
    			i=p.getInputStream();
    			s = toString(i);
    		}catch(Exception e)
    		{
    		}
    		finally {
    			if(i!=null)
        			try
        			{
        				i.close();
        			}catch(Exception e)
        			{
        			}
    		}
    		try
    		{
    			p.waitFor();
    		}catch(Exception e)
    		{
    		}
    		System.out.println(s);
    	}
    }
    et l'output :
    [oapcp00@l155902obsias logs]$ java Test


    [oapcp00@l155902obsias logs]$ echo $ORACLE_HOME
    /oracleas/0904/oapcp00

    Jme suis encore trompé ou ?

    Fred

    P.S. : pas d'exception levée, je viens d'ajouter des SOP

  15. #15
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mavina
    P.S. : pas d'exception levée, je viens d'ajouter des SOP
    C'est pas beau les bloc catch vide

    En plus tu t'embêtes avec tes 3 try/catch !!! En intégrant le try/finally directement dans le try/catch c'est nettement plus lisible et tu as un seule gestion des exceptions :
    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
        public static void main(String[]args)
        {
            String s=null;
     
            try
            {
                Process p = Runtime.getRuntime().exec(new String[]{"sh","-c","echo", "$ORACLE_HOME"});
                p.getOutputStream().close();
                p.getErrorStream().close();
                InputStream i=p.getInputStream();
                try {
                    s = toString(i);
                } finally {
                    i.close();
                }
                p.waitFor();
     
            } catch(Exception e) {
                e.printStackTrace();
            }
     
            System.out.println(s);
        }
    Sinon il est peut-être possible que sh -c attendent un seul paramètre, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Runtime.getRuntime().exec(new String[]{"sh","-c","echo $ORACLE_HOME"});
    (désolé je ne peux pas testé)

    a++

  16. #16
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    un seul argument, super ca marche niquel

    merci

    Fred

  17. #17
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    En fait ca marche dans la classe test, mais apparemment en execution Java EE (c'est un logger), ca n'a pas l'air de fonctionner.
    J'ai une exception de type IOException avec comme message :
    sh: Not found
    sur cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Process p = Runtime.getRuntime().exec(new String[]{"sh","-c","echo $ORACLE_HOME"});
    Voilà voilà

    Fred

    P.S. : la classe test a été testée sur le serveur oracle où les applications sont déployées

  18. #18
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Tu peux essayer avec le chemin complet vers le shell : /bin/sh en général...

    a++

  19. #19
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    pareil

    et c'est bien /bin/sh

    Fred

  20. #20
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Hmmmm...


    Ton application n'a peut-être pas les droits d'exécuter un autre process (ou un shell en tout cas).

    Tu arrives à lancer d'autres programme, style ls ?

    a++

Discussions similaires

  1. [Ant] Récupérer une variable d'envionnement
    Par lionel69 dans le forum ANT
    Réponses: 4
    Dernier message: 25/01/2007, 10h22
  2. Récupérer une variable --> Javascript+CSS
    Par Skarlix dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/08/2005, 16h01
  3. [Applet] récupérer une variable PHP ?
    Par Shiryu44 dans le forum Applets
    Réponses: 10
    Dernier message: 22/03/2005, 11h39
  4. [JSTL] Récupérer une variable du style <%String bob = "bobby"%>
    Par nickoshiba dans le forum Taglibs
    Réponses: 2
    Dernier message: 15/03/2005, 08h50
  5. récupérer une variable
    Par boucher_emilie dans le forum ASP
    Réponses: 9
    Dernier message: 05/07/2004, 10h34

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