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

ANT Java Discussion :

Envoyer un input à un programme externe (ant)


Sujet :

ANT Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut Envoyer un input à un programme externe (ant)
    Bonjour,

    Voilà je cherche depuis un moment à lancer mon jar avec une possibilité d'intéraction quand j'appelle mon programme externe.
    Mon jar lance ant avec des paramètres, mais le fait est qu'une balise nommée <input/> dans le script ant, attends que l'utilisateur envoie une touche clavier.

    Est-il possible d'envoyer un input à un programme externe depuis une invite de commande au lancement du jar ?

    J'ai regardé les pistes de System.in, mais je n'avance pas.
    Si quelqu'un avait une piste, merci d'avance !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Par défaut
    Salut

    Je ne suis pas sûr de bien comprendre.
    Si je résume, tu veux passer des arguments à ton jar qui les transmettra ensuite à ant (qui est appelé par ton programme java).
    C'est bien ça ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut
    Oui c'est bien ça. Entre autre, je dois pouvoir interagir avec le script ant.

    J'ai passé un outputstream pour lorsqu'un utilisateur rentre quelque chose, que cela soit pris en compte mais une fois l'entrée saisie et envoyé au programme externe, mon thread a l'air d'attendre quelque chose.

    Voici le bout de code correspondant :
    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
     
    new Thread() {
    			public void run() {
     
    				final byte[] b = new byte[1];
     
    				BufferedOutputStream out = new BufferedOutputStream(p
    						.getOutputStream());
     
    				try {
    						while(System.in.read(b) != 0){							
    							out.write(b);
    							out.flush();
    						}
     
     
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} finally {
    					try {
    						out.close();
    					} catch (IOException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    			}
     
    		}.start();

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Par défaut
    T'as essayé en envoyant le caractère end of file ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut
    Je pense que je suis un peu perdu dans ce que je fais.

    En fait, dans le cas où le script ant demande plusieurs input, mon bout de code (bancale j'avoue) permet d'entrer plusieurs input car le flux de sortie ne sera jamais fermé. Le script pourra continuer mais le flux tjs en attente d'être fermé.

    Si je rentre comme tu dis un caractère end of file, je pense que l'exécution de mon jar s'arrêterait et mon script qui attends les input obtiendront une valeur null.

    Il y a une logique qui doit me manquer dans tout ça

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Par défaut
    Peut être qu'avec plus de détails on pourra t'aider.
    Comme un exemple d'exécution, pour voir les intéractions entre ton programme java et le script ant (et les valeurs dont il a besoin en input).

    Sinon, je vois deux possibilités a priori:
    1) récupérer toutes les valeurs nécessaire à ant au début du programme et les lui transmettre au moment voulu (je ne sais pas ce que ça vaut, je n'ai jamais utilisé la tâche input)
    2) éditer un fichier properties (après avoir obtenu les valeurs comme dans le premier cas) et modifier le script ant pour qu'il récupère les valeurs depuis ce fichier (comme ca on évite la tâche input)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut
    Alors pour un exemple d'exécution, ceci pourrait se dérouler comme cela :
    -Lancement du jar avec des arguments passés en entrée
    -Le script ant est exécuté et une balise <input/> est rencontrée pour faire une pause et permettre à l'utilisateur de vérifier les informations à l'écran avant la suite du script et de le valider par la touche entrée (avec un input tu peux intégrer un message, et des arguments valides en gros)
    -le script continue...
    -Input , une valeur est demandée à être renseigné pour alimenter une variable
    -Input, une seconde valeur pourrait être demandée pour une autre variable
    etc...

    Il est vrai que le fichier de properties est la chose principale que j'utilise mais mes scripts ant imbriquent déjà des properties à d'autres niveaux et dans le cas où il y a besoin d'une saisie utilisateur ponctuelle, ça peut-être légèrement embêtant.
    Le fait est de savoir comment fermer le flux de sortie une fois que le script ant se termine.
    J'ai bien essayé lorsque le flux d'entrée lit "BUILD" mais je me demande s'il faut fermer les flux avant que le programme java puisse sortir.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Par défaut
    Désolé mais j'ai du mal à suivre
    mais on va bien finir par s'en sortir

    Le fait est de savoir comment fermer le flux de sortie une fois que le script ant se termine.
    J'ai bien essayé lorsque le flux d'entrée lit "BUILD" mais je me demande s'il faut fermer les flux avant que le programme java puisse sortir.
    Tu parles du flux de sortie de ton process ant exécuté depuis ton programme java ?
    Je pensais que ton problème était lié à l'envoie de données à ton process depuis le programme java.

    De manière générale, tu dois surement pouvoir détecter la fin de ton process et ferner tous les flux à ce moment là.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut
    Oui c'est ça, le flux de sortie du process du programme externe (soit si je ne me trompe pas le flux d'entrée pour le programme java).
    J'ai pu finalement faire arrêter le programme car je m'étais trompé de thread (j'écrivais dans celui qui gérait la sortie d'erreur ).

    Maintenant je me demandais, toujours en rapport avec l'envoie de données au process depuis java, si je pouvais utiliser autre chose que du KeyStroke pour enregistrer une touche appuyée par l'utilisateur et de quitter le process java dans une console (win ou unix) avec une touche du genre "Echap". KeyStroke est présent dans swing donc si j'utilise mon jar sur une machine unix, n'aurais-je pas un souci de compatibilité ?

  10. #10
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Par défaut
    Au niveau compatibilité, c'est l'avantage de swing, ça ne pose pas de problème.

    Par contre je pensais que tu utilisais System.in.read, comme décrit dans ton deuxième post, pour envoyer des données à ant ?

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut
    J'utilise System.in.read effectivement pour envoyer les données aux input, mais les touches spécifiques comme Ctrl ou Echap ne sont pas pris dedans, ce qui me serait utile pour arrêter mon script.

    Par rapport à swing, j'oubliais de préciser qu'il est possible que j'ai des environnements unix sans mode graphique.

    Merci de ta patience en tout cas

  12. #12
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Merci de ta patience en tout cas
    je fais de mon mieux

    Je ne suis pas sûr mais a priori si la jvm installée supporte KeyStroke il ne devrait pas y avoir de problème. Et puis cette classe n'affiche rien, elle gère juste l'interaction avec le clavier.

    Par contre, pourquoi vouloir arrêter ton script ant ?

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut
    D'accord, je regarderai un peu mieux l'utilisation de keystroke .

    J'aimerai gérer l'arrêt du script dans le cas ou la personne aurait fait une erreur de frappe pour les inputs, ou remarque une erreur de valorisation du script ou des properties.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut
    Je reup, j'ai un soucis pour quitter mon appli java.

    L'utilisation de keystroke n'est pas possible dans un environnement non graphique : ( .
    Donc est-ce-qu'il existe un moyen de quitter une appli java et son subprocess en mode console, comme on peut le faire sous unix ou win (ctrl-C ou ctrl-Q) ?

    Edit : J'ai pu finalement faire une condition de sortie, le fait est que la méthode p.destroy() ne kill pas le subprocess... est-ce normal ?

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 61
    Par défaut
    Rebonjour !

    Je reup pour la même raison que le précédent poste.

    Je souhaite fermer mon application qui est en mode console (unix/windows) une fois qu'un utilisateur veut quitter l'application.

    Pour expliquer la situation, je lance un programme externe avec mon bout de code java.
    Ce programme externe c'est Ant. Il est probable dans le lancement de scripts xml, qu'une balise (<input>) demande une entrée utilisateur à un moment de l'exécution. Donc j'envoie de manière continue vers l'OutputStream du process tant que l'utilisateur tape kke chose, des données.
    Le problème est que lorsque je souhaite sortir de mon appli, j'ai remarqué que le process n'était jamais killé et si je sortais au moment où il y avait un input par exemple, le process java continuait (il bouclait sur le message qui demande un input sous ant) et utilisait 50% du process. Dans tous les cas, le subprocess "ant" ne se termine que quand les tâches se finissent.
    J'ai testé les méthodes du process (destroy,interrupt...), ou l'utilisation de addshutdownhook mais rien de probant.

    Ma question est la suivante, y a t-il une bonne méthode pour arrêter un subprocess java ?

Discussions similaires

  1. Envoyer des string à un programme externe
    Par darkfrag dans le forum C++
    Réponses: 1
    Dernier message: 26/03/2008, 15h47
  2. Envoyer une variable vers stdin d'un programme externe
    Par ben_cines dans le forum Général Python
    Réponses: 2
    Dernier message: 13/03/2008, 21h08
  3. [Kylix] pb d'appel de programme externe
    Par wizwiz dans le forum EDI
    Réponses: 2
    Dernier message: 27/08/2004, 09h29
  4. workspace_loc, outils externes, Ant
    Par supbobo2004 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 28/06/2004, 17h49
  5. appel programme externe depuis pl/sql
    Par txouki dans le forum PL/SQL
    Réponses: 6
    Dernier message: 11/05/2004, 18h35

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