2010-05-17 5 views
2

Comment une application Java peut-elle générer une nouvelle application interactive (par exemple un éditeur de ligne de commande) à partir de Java/Scala? Lorsque j'utilise Runtime.getRuntime().exec("vim test"), j'obtiendrais uniquement une instance Process, alors que vim fonctionnerait en arrière-plan; plutôt que d'apparaître à l'utilisateur.Création d'un processus interactif

Répondre

0

En supposant que vous êtes sur Linux, vous avez fait pour exécuter la commande dans une nouvelle fenêtre de terminal

Runtime.getRuntime().exec(new String[]{"xterm", "-e", "vim test"}); 
+0

Merci, mais j'espérais lancer l'application sur le même terminal. – notnoop

+1

Cela suppose que votre code Java dispose d'un terminal de contrôle et des liaisons standard des descripteurs 0, 1 et 2. –

4

Vous devrez envelopper les auteurs d'entrée et de sortie en utilisant System.console()

Vous devrez rediriger manuellement chaque entrée au processus engendré et chaque sortie à l'utilisateur.

0

MMmmm. Essayez ceci:

scala.sys.Process("vim test").run(true) 

Oops, qui est seulement sur le tronc Scala - peut-être Scala 2.9.

0

Note: Vous devez seulement utiliser cette méthode lorsque vous devez absolument avoir un terminal/console comme ce qui exige vim. Pour toutes les autres utilisations, rendez-vous avec Runtime.exec().

Je viens d'avoir ce même problème. Ce que j'ai appris à travailler utilise Java Native Interface pour appeler dans une petite fonction c qui fait un appel système:

SystemProcess.java:

class SystemProcess { 
    public native int systemCall(String cmd); 
    public boolean execute() { return systemCall("vim test") == 0; } 
    static { System.loadLibrary("SystemProcess"); } 
} 

SystemProcess.c

#include [javah-generated-header.h] 
[javah-generated-function-prototype] (JNIEnv *env, jobject obj, jstring jcmd) { 
    jboolean iscopy; 
    const char *cmd = (*env)->GetStringUTFChars(env, jcmd, &iscopy); 
    jint ec = system(cmd); 
    (*env)->ReleaseStringUTFChars(env, jcmd, cmd); 
    return ec; 
} 

Je vais vous laisser le soin de faire toute la génération de l'en-tête et la compilation de c dans la bibliothèque partagée. N'hésitez pas à remplacer le système par fork/exec ou posix_spawn si cela vous fait vous sentir mieux. Mais pour la plupart, cela devrait fonctionner comme sur unix/linux.

0

En 1,7, c'est assez simple. (Bien sûr, tout est quand vous l'avez résolu avant)

ProcessBuilder builder = new ProcessBuilder("/usr/bin/vim"); 
Map<String, String> environ = builder.environment(); 
builder.redirectInput(ProcessBuilder.Redirect.INHERIT); 
builder.redirectOutput(ProcessBuilder.Redirect.INHERIT); 
final Process process = builder.start(); 
process.waitFor();