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

avec Java Discussion :

de l'usage de Runtime.getRuntime().exec()


Sujet :

avec Java

  1. #1
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Points : 76
    Points
    76
    Par défaut de l'usage de Runtime.getRuntime().exec()
    Y'a t'ils des risques, des inconvénients à utiliser cette instruction ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Runtime.getRuntime().exec("java -jar "+nomDeMonJar);
    et si oui, y'a t'il un moyen plus propre à utiliser ?

    Je me pose cette question, car j'ai un programme "serveur" (entendez par là une application java qui permet de "simuler un serveur chat et jeu" qui donne la possibilité par l'appui sur un bouton de lancer un programme "client" et quand je procède ainsi, 8 fois sur 10, la relation client/serveur fini par planter (pour une raison que je n'ai malheureusement pas déterminée).
    Or quand je lance les deux programmes séparément, en saisissant "java -jar nomdeJar" en cmd dos, ça ne plante jamais.

    Qu'est ce qui diffère fondamentalement dans ces deux manières d'ouvrir mon jar executable ?
    Le GridBagLayout est mon ami ! (mais si, mais si...)

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Que dit la console de l'application lancée lorsqu'elle plante (stacktrace, etc?)

    Sinon ta commande a un problème majeur: les espaces. Je préfèrerais la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Runtime.getRuntime().exec(new String[] {"java","-jar",pathDeMonJar});

  3. #3
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Points : 76
    Points
    76
    Par défaut
    Ok, je ferais la modif pour les espaces. En quoi est-ce un problème "majeur" ? Pour une question de portabilité ?

    Malheureusement, je n'ai pas de Stacktrace, (le programme lancé par la commande exec n'a pas de fenêtre console) visiblement, il ne s'agit pas d'une exception, mais d'une faille de mon programme et/ou un blocage système. Je me suis rendu compte que lorsque j'arrêtais le "serveur", les messages attendus arrivaient d'un coup au client.
    Comme je ne comprend pas où le programme peut 'bloquer' les messages sortants et que je peux pas vous demander ça, je me préoccupe pour le moment du "pourquoi je n'ai pas le même problème avec un programme lancé séparément ?"

    Merci déjà pour ce début de réponse.
    Le GridBagLayout est mon ami ! (mais si, mais si...)

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    quand tu exécute une application en java, c'est à ton programme java de gérer sa console, car java redirige automatiquement le stdout et le stderr de ces programmes vers des streams java (accessible via l'objet process retourné par excec). Il est possible que tu aie "oublié" de lire ces streams et dans ce cas, quand les buffers sont pleins, les programment "bloquent". donc, faut les lire

    Sinon le problème d'espace c'est que si ton java exécuté se trouve dans un répertoire avec des espace, java va couper ce chemin en deux argument => ca marchera pas ^^

  5. #5
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Il est possible que tu aie "oublié" de lire ces streams et dans ce cas, quand les buffers sont pleins, les programment "bloquent". donc, faut les lire

    hé, hé, hé, "oublié" ça doit être ça.... J'ai surtout oublié de savoir ce que c'est que ces stdout et stderr... Je peux me documenter ou ? Je trouve pas de tuto java sur ces bêtes bizarres...
    Le GridBagLayout est mon ami ! (mais si, mais si...)

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    En anglais, dans la javadoc de "Process" sur l'api de java:

    The Runtime.exec methods create a native process and return an instance of a subclass of Process that can be used to control the process <.....>
    The created subprocess does not have its own terminal or console. All its standard io (i.e. stdin, stdout, stderr) operations will be redirected to the parent process through three streams (Process.getOutputStream(), Process.getInputStream(), Process.getErrorStream()). The parent process uses these streams to feed input to and get output from the subprocess. Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, and even deadlock.
    T'as aussi de la doc là:
    http://ydisanto.developpez.com/tutor.../runtime/#LIII

  7. #7
    Membre régulier
    Inscrit en
    Juin 2008
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 127
    Points : 76
    Points
    76
    Par défaut
    Bon, j'ai utilisé le code fourni dans le tuto par Yann Disanto.
    Merci bien , ça marche nickel Tchize
    Le GridBagLayout est mon ami ! (mais si, mais si...)

Discussions similaires

  1. [Système][Runtime]getRuntime().exec
    Par Neptune8 dans le forum API standards et tierces
    Réponses: 11
    Dernier message: 22/02/2011, 20h34
  2. Runtime.getRuntime().exec sous linux
    Par syl2095 dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 30/01/2007, 13h56
  3. Runtime.getRuntime().exec(String) méthode sort
    Par devAd dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2006, 14h53
  4. [Runtime.getRuntime().exec] ouvrir un fichier ??
    Par miloud dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 29/03/2006, 15h23
  5. [Swing] execution avec Runtime.getRuntime().exec
    Par benssj5 dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 25/08/2004, 15h54

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