Ich brauche einen "System" -Funktionsaufruf, derselbe wie in Python, Perl, PHP, Ruby, & c. Es wird eine Komponente einer JavaScript-Standardbibliothek namens Narwhal sein, wenn es auf der Rhino-JavaScript-Engine ausgeführt wird, die wiederum auf Java ausgeführt wird.Implementierung des "System" -Befehls in Java
Das Problem ist, dass die Java-Standard-Bibliothek die Fähigkeit, einen Subprozess zu erzeugen, abstrahiert hat, der das stdio des Elternprozesses teilt. Dies bedeutet, dass Sie Interaktivität nicht auf den Subprozess verzögern können.
Mein erster Crack dabei war Pythons subprocess.popen zu implementieren. Dies verwendet drei "pumper" -Threads, um das stdio des übergeordneten Prozesses unabhängig zu kopieren (um Deadlock zu verhindern). Leider gibt uns das zwei Probleme. Erstens wird die Eingabe nicht automatisch geschlossen, wenn der Unterprozess freiwillig beendet wird. Zweitens puffern und strömen die Ströme zum Kindprozess nicht richtig.
Ich suche nach Lösungen, die unseren require ("os"). System() Befehl funktionieren würde, wie man erwarten würde.
Das Projekt ist bei http://narwhaljs.org
Relevante Code:
- http://github.com/tlrobinson/narwhal/blob/d147c160f11fdfb7f3c0763acf352b2b0e2713f7/lib/os.js#L10
- http://github.com/tlrobinson/narwhal/blob/d147c160f11fdfb7f3c0763acf352b2b0e2713f7/engines/rhino/lib/os-engine.js#L37
Durch das Hinzufügen des jni.jar konnte dieses Bit JavaScript erfolgreich eingesetzt werden. Vielen Dank! var jna = Pakete.com.sun.jna; var clib = jna.NativeLibrary.getInstance (jna.Platform.isWindows()? "Msvcrt": "c"); var csystem = clib.getFunction ("System"); csystem.invoke (["Echo Hallo, Welt!"]); http://gist.github.com/181225 –