2017-03-02 2 views
-2

Ich versuche, den folgenden Befehl auszuführen:Run mysql Befehl java

C:\Program Files\MySQL\MySQL Server 5.7\bin\mysql" -u root -padmin <C:\script.sql> C:\redir.txt 

durch diesen Java-Code verwendet:

Runtime.getRuntime().exec(command); 

wo Befehl einen String mit mysql-Befehl ist. Wenn ich den Befehl von einem Cmd verwende, funktioniert es perfekt, aber wenn ich die Java-Zeile ausführe, erstellt es nicht die redir.txt mit dem Ergebnis der Abfrage. Ich kann nicht herausfinden, warum es nicht funktioniert (übrigens wirft es keine Ausnahme oder Fehlermeldung jeglicher Art).

+0

exec() hat eine ganze Reihe von Idiosynkrasien, die es nicht einfach machen zu verwenden. Dies ist ein sehr nützlicher Artikel: http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html. Allerdings poste ich auch deinen Code. –

+0

Warum? Es läuft als Service. Es ist so konzipiert, dass es als Dienst ausgeführt werden kann. Was genau ist der Sinn, eine andere Möglichkeit zu schaffen, es zu starten? – EJP

Antwort

0

Verschiedene Probleme, beginnend hier:

< C:\script.sql 

jeweils dort.

Diese "Weiterleitungen" funktionieren einfach nicht innerhalb von Befehlen, die Sie von Java gesendet haben. Bedeutung: Diese "<" und ">" werden von der cmd.shell behandelt.

Es könnte möglich sein, einen Befehl zu erstellen, wie

cmd.exe .... 

, die mit diesen Rohren arbeitet; aber ich bin mir nicht sicher. Was wird definitiv funktionieren:

  • Verwenden Sie einen Prozess Builder und erwerben Sie die Standardeingabe des Unterprozesses; und seine stdout/Stderr Ausgabeströme
  • Schreib Java-Code, die den Inhalt script.sql in diesen stdin Strom schreibt und liest, dass vom stdout Strom, beispielsweise zu drücken, die in die redir.txt outfile

Und schließlich: Sie Flucht haben die einzige \ zu \\ innerhalb der Stringliterale in Ihrem Befehl!

0

Setzen Sie den Befehl in eine Batch-Datei/Bash-Skript (abhängig von Ihrer Umgebung) und rufen Sie das exec(). Javas exec() hat viele Probleme, besonders wenn es sich um Befehlszeilenparameter handelt. Dies ist normalerweise der beste Weg, dies zu umgehen.