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 :

Commande externe impossible


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Par défaut Commande externe impossible
    Salut à tous,


    Un soucis récurrent me colle à la peau depuis un moment.Votre aide est précieuse...

    J'aimerais pouvoir récupérer une liste de tags contenu dans un serveur svn distant. Pour cela je passe en ligne de commande windows cette simple commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    svn list adresse_du_repository/tags > C:\liste_tags.txt
    pour cela j'ai édité en Java les lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    runtime.exec(new String[]
    {"C:\\Program Files\\svn\\bin\\svn.exe", "list", "http://repository/tags", ">", "C:\\test.txt"});
    J'ai utiliser pleins de variantes à cette commande et pourtant rien ne marche.
    Je sais que plus tard je vais avoir besoin de passer par des threads pour gerer convenablement mais pour le moment j'aimerais simplement arrivé à généré un fichier texte de ma liste des tags présent dans mon svn.

    Je sais que je pourrais procédé de façon différente et restant dans JAVA mais pour le moment je ne suis pas assez avancé dans JAVA pour procédé de la sorte.D'où le fait de passer par un runtime.exec et par des choses assez primitive, mais j'en est besoin...

    Comment puis-je arriver à mes fin de facon la plus simple svp ?

    Merci à vous

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    le '>' quand tu passe en ligne de commande est interprété par le shell, ce qui fait que svn ne vois jamais "> fichier.txt". C'est le shell qui se charge de créer le fichier et d'y envoyer l'outputstream du programme. Dans ton cas, t'as deux possibilité


    1) modifier la commande pour passer par cmd.exe et lui passer en un seul paramètre la commande à exécuter

    2) après le exec(), tu prend sa valeur de retour, de type process, et tu utiliser process.getInputStream() pour lire ce que dit svn (avantage, t'as pas besoin de passer par un fichier, tu peux traiter au vol ce que fait svn, pas besoin de passer après par un fileinputstream pour faire ton traitement).

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Par défaut
    1) modifier la commande pour passer par cmd.exe et lui passer en un seul paramètre la commande à exécuter
    Impossible de ne passer qu'un paramètre ou même deux. Si je dois utilisé cmd.exe ca me réduit mon champs de possibilité et ça ne marche pas non.
    Il semblerais que le passage de commande avec exec() serais très difficile d'après ce que j'ai pu lire sur d'autre forum.
    J'ai testé des tas de façon d'écrire différentes de la commande mais rien n'y fait.

    2) après le exec(), tu prend sa valeur de retour, de type process, et tu utiliser process.getInputStream() pour lire ce que dit svn (avantage, t'as pas besoin de passer par un fichier, tu peux traiter au vol ce que fait svn, pas besoin de passer après par un fileinputstream pour faire ton traitement).
    Effectivement c'est pas mal du tout comme solution si bien sûr ma commande avant marche.

    Arrive tu, de ton coté, avec la méthode exec(), à lancer une commande avec plus de 2 arguments ?

    Sinon peut-être me tourné vers une solution plus technique comme aller lire directement sur mon svn(accessible en http sur le web)le contenu du dossier désiré et le récupérer. Mais je ne sais pas du tout comment m'y prendre.

  4. #4
    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,

    Citation Envoyé par miltone Voir le message
    Impossible de ne passer qu'un paramètre ou même deux. Si je dois utilisé cmd.exe ca me réduit mon champs de possibilité et ça ne marche pas non.
    Non il vaut dire qu'il faut passer la ligne de commande entière à cmd.exe comme un seul et unique paramètre.
    cmd.exe correspond au shell Windows et il se chargera d'interpréter la ligne de commande (et donc les redirections).
    Mais bon c'est encore moins portable (il faudrait au moins gérer /bin/sh pour les OS Unixes).


    Citation Envoyé par miltone Voir le message
    Il semblerais que le passage de commande avec exec() serais très difficile d'après ce que j'ai pu lire sur d'autre forum.
    Il y a des contraintes à prendre en compte, en particulier :
    • Runtime.exec() permet de lancer un exécutables avec des paramètres, et en aucun cas d'interpréter une ligne de commande. En clair les caractères spéciaux du shell sont passé tel quel sans être interprété !
    • Le Process ainsi lancé est lié avec l'application Java via 3 flux correspondant à ses entré/sorties standard. Ces flux utilisent un buffer assez petit qui bloquera l'application s'il est plein.
      Ces flux doivent impérativement être fermés ou consommés (depuis des threads différents) sous peine d'inter-blocage...



    Pour plus d'info :



    Citation Envoyé par miltone Voir le message
    Sinon peut-être me tourné vers une solution plus technique comme aller lire directement sur mon svn(accessible en http sur le web)le contenu du dossier désiré et le récupérer. Mais je ne sais pas du tout comment m'y prendre.
    Pourquoi ne pas passer directement par une librairie SVN en Java ? Cela doit bien exister non ?


    a++

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par miltone Voir le message
    Impossible de ne passer qu'un paramètre ou même deux. Si je dois utilisé cmd.exe ca me réduit mon champs de possibilité et ça ne marche pas non.
    Il semblerais que le passage de commande avec exec() serais très difficile d'après ce que j'ai pu lire sur d'autre forum.
    Ca n'a rien de difficile, juste que les gens généralement ne comprennent pas que exec() != shell . Exec() exécute une application, shell exécute une commande, là est toutes la différence. Malheureusement, je trouve, la jaadoc utiliser le terme commande qui peut prêter à confision. Pour le cmd.exe je pensais à quelque chose du genre


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec(new String[] {"cmd.exe","svn list adresse_du_repository/tags > C:\liste_tags.txt"});
    (je connais pas la syntaxe exacte de cmd.exe)


    Pour ce qui est de "voir si la commande svn fonctionne", c'est facile, suffit de lire son inputstream et de l'afficher quelque part (dans la console, dans un JTextaArea, etc) et regarder ce que ça dit.


    +1 pour la suggestion d'utiliser qqch comme libsvn.

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/06/2006, 14h57
  2. [Système] Exécution commande shell impossible
    Par mick84m dans le forum Langage
    Réponses: 5
    Dernier message: 28/04/2006, 15h43
  3. [Système] Pb exécution d'une commande externe
    Par licorne dans le forum Langage
    Réponses: 9
    Dernier message: 19/10/2005, 16h34
  4. [Lazarus] Exécution de commande externe
    Par SaintShakaJin dans le forum Lazarus
    Réponses: 3
    Dernier message: 26/04/2005, 13h13
  5. Réponses: 5
    Dernier message: 19/04/2005, 08h50

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