Soru Java / Groovy'de Sistem komut çağrıları nasıl yapılır?


Yapmak istediğim, maven'i harika bir senaryodan çağırmak. Söz konusu groovy betik, bir etiket indirerek ve indirilene göre maveni çağırarak J2EE projeleri oluşturmak için bir maven sarıcı olarak kullanılır. EAR'yi oluşturmak / paketlemek için maven'i çağırmayı nasıl başarabilirim (groovy betiği zaten etiketi SCM'den indirebilir).


22
2018-04-23 19:48


Menşei




Cevaplar:


Groovy'de harici bir işlemi çağırmanın en basit yolu bir dizede execute () komutunu kullanmaktır. Örneğin, bir groovy komut dosyasından maven çalıştırmak için şunu çalıştırın:

"cmd /c mvn".execute()

Komutun çıktısını yakalamak ve belki de yazdırmak isterseniz, bunu yapabilirsiniz:

print "cmd /c mvn".execute().text

Başlangıçtaki 'cmd / c', Windows komut kabuğunu çağırır. Mvn.bat bir toplu komut olduğundan, buna ihtiyacınız var. Unix için sistem kabuğunu çalıştırabilirsiniz.


34
2018-04-24 00:09



Güzel! Bunu yapabileceğini bilmiyordum. - armandino
Bu benim için ilk kez çalıştı. Süreç "consumeProcessOutput ()" rotasını bir süreliğine reddetti, ancak bununla hiçbir zara sahip değildi. Bu, Docker kurulumunun başarısızlık nedenlerini belirlemede büyük ölçüde yardımcı olacaktır. - eversMcc


Bu kadar basit

"yourCommand".execute();

Eğer standart çıktı üzerinde çalıştırılan komut üzerinde baskı çıktıları almak istiyorsanız

def proc = "yourCommand".execute();
proc.waitForProcessOutput(System.out, System.err);

Eğer çıktıyı saklamak ve işlemek istiyorsanız

def proc = "yourCommand".execute();
def outputStream = new StringBuffer();
proc.waitForProcessOutput(outputStream, System.err);
println(outputStream .toString());

20
2017-08-13 17:35



bu def'i yaptığımda homeDir = "c: / test / server"; def workDir = "$ {homeDir} / workDir"; def tempDir = "$ {workDir} / tmp"; println (homedir); println (WORKDIR); runShell ("cd c:"); // runShell ("mkdir -p $ {tempDir}"); void runShell (Dize s) {def yürütme = s.execute (); execute.waitForProcessOutput (System.out, System.err); def değeri = execute.exitValue (); eğer (val> 0) {yeni istisna at ("Çıkış değeri: $ {value}"); }} Aşağıdaki gibi bir hata alıyorum java.io.IOException: "cd" programı çalıştırılamıyor: CreateProcess error = 2, Sistem belirtilen dosyayı bulamıyor - user641887


Java 7+ stdio yönlendirme için:

new ProcessBuilder('cmd', …args…).redirectOutput(ProcessBuilder.Redirect.INHERIT).start().waitFor();

4
2017-12-10 18:02



Eğer bir geçersen List hataların, öğelerin hepsinin olduğundan emin olun Strings ve değil gstringinterpolasyonlu değişkenler. Ayrıca unutma redirectError de. - seanf


Bir kabuk komutunu başlatmak için Runtime sınıfını kullanabilirsiniz. buraya bir göz atın: http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#exec(java.lang.String) Daha sonra Proses uygulamasının sonuçlarını (başarısız olup olmadığını öğrenmek için) alabilirsiniz.


2
2018-04-23 20:15