UNIX Shell befehl über JavaCode ausführen

Basti91

Mitglied
Hi,
wie im Titel schon erwähnt, möchte ich über Java Befehle auf der UNIX Shell ausführen.
Auf Windows funktioniert mein Code jedoch wollte ich ihn auf UNIX umportieren und habe entsprechende Änderungen getroffen, leider ohne Erfolg.

Mein UNIX Code:
Java:
ProcessBuilder builder = new ProcessBuilder( "bash", "/c","COMMAND"); 
		try {
			Process p = builder.start();
		} 
		catch (IOException e) {
			e.printStackTrace();
		}


Mein Windows Code:
Java:
ProcessBuilder builder = new ProcessBuilder( "cmd", "/c","COMMAND"); 
		try {
			Process p = builder.start();
		} 
		catch (IOException e) {
			e.printStackTrace();
		}

Anscheinend muss es an dem Ersetzen vom "cmd" durch "bash" liegen jedoch habe ich nur Referenzen gefunden die "bash" benutzen.
Noch zu erwähnen ist vllt, dass ich ein Mavenkommando ausführen will also plattformunabhängig.
 

Ark

Top Contributor
Unix bzw. unixoide Systeme funktionieren ganz anders. ;)

Unter Windows kommt mit cmd ein hässliches Fenster daher. Dieser Befehl ist unter Windows auch noch ziemlich eindeutig. Zum Ausführen von Befehlen ist cmd aber nicht notwendig!

Unter Unixoiden funktioniert das alles komplett anders. Eine Shell (z.B. bash) macht noch kein Fenster, und außerdem gibt es nicht nur bash, sondern auch noch csh, ksh, sh, … Wenn du ein Fenster benötigst (im Sinne von: du musst sysouts live verfolgen können oder über sysin was eingeben), wird die Sache noch komplizierter, denn es gibt nicht nur "den" Terminalemulator (wie bei Windows cmd), sondern z.B. gnome-terminal, konsole, urxvt, xterm, roxterm …

Brauchst du dieses Fenster auch unter Unixoiden? Wenn nicht: Führe einfach [c]COMMAND[/c] aus. Wenn doch, könnte es leichter sein, wenn der Benutzer selbst das Terminal startet und den Befehl ausführt.

Was genau soll denn letztendlich passieren? Was ist wichtig? Und wie genau hast du das unter Windows gelöst? Dann kann man dir eventuell auch sagen, wie so etwas normalerweise bei Unixoiden abläuft.

Ark
 
Zuletzt bearbeitet:

Basti91

Mitglied
Ich habe ein Programm zur Unterstüzung von Maven für Laien gebaut.
Durch Angabe von Pfad, Name und Version wird so die pom.xml erstellt und automatisch das Maven Projekt gebuildet.
Daher möchte ich den Maven Build-Befehl ausführen.
 

Ark

Top Contributor
Daher möchte ich den Maven Build-Befehl ausführen.
Spricht was dagegen, einfach den Befehl auszuführen?
Java:
ProcessBuilder builder = new ProcessBuilder( "mvn", "sonstige", "argumente"); 
try {
    Process p = builder.start();
} 
catch (IOException e) {
    e.printStackTrace();
}

Okay, unter Windows kommt dann kein Fenster mehr (sofern vorher eines kam), aber wenn das ein Problem sein sollte, kriegt man das wahrscheinlich auch ganz anders (und vor allem plattformunabhängiger) gelöst.

Ark
 

Asgar13

Bekanntes Mitglied
Java:
ProcessBuilder builder = new ProcessBuilder("/bin/bash", "-c","COMMAND"); 
try {
    Process p = builder.start();
} 
catch (IOException e) {
    e.printStackTrace();
}

Funktioniert bei meinen Linux, also aus
Code:
/bash
zu
Code:
/bin/bash
machen und
Code:
 /c
zu
Code:
-c
 

Ark

Top Contributor
@Asgar13: Und was ist, wenn statt bash eine andere Shell verwendet wird? Oder wenn bash nicht in [c]/bin[/c] liegt? Und (an den Threadstarter): warum überhaupt eine Shell?

Ark
 

Basti91

Mitglied
Ich bin ein UNIX Neuling und weiss daher nicht was ich sonst verwenden sollte.
Für jegliche Vorschläge wie ich das Problem sonst lösen könnte bin ich daher natürlich offen
 

TheDarkRose

Gesperrter Benutzer
Ark hat es eh schon vorgeschlagen.
Code:
ProcessBuilder builder = new ProcessBuilder( "mvn", "sonstige", "argumente");

Du brauchst keinen Umweg über CMD oder Bash gehen, da der ProccessBuilder die Kommandos von selbst in der jeweiligen Shell ausführt.
 

Basti91

Mitglied
Mein Processbuilder sieht nun so aus:

Java:
ProcessBuilder builder = new ProcessBuilder( "mvn","mvn archetype:create -DgroupId=GROUPID -DartifactId="ARTIFACTID);

Jedoch bei der Ausführung kein Erfolg
 

Ark

Top Contributor
Du musst jedes Argument einzeln aufzählen, ungefähr so:
Java:
ProcessBuilder builder = new ProcessBuilder( "mvn","archetype:create", "-DgroupId=GROUPID", "-DartifactId=ARTIFACTID");
Ark
 
B

bygones

Gast
Ich habe ein Programm zur Unterstüzung von Maven für Laien gebaut.
Durch Angabe von Pfad, Name und Version wird so die pom.xml erstellt und automatisch das Maven Projekt gebuildet.
Daher möchte ich den Maven Build-Befehl ausführen.
dann mach daraus ein Maven Plugin und der nutzer soll selbst dann "mvn bastisPlugin" ausfuehren....
 

Basti91

Mitglied
@bygones: das kommt mir aber für den User zu umständlich vor. Wenn es doch unter Windows funktioniert muss es doch auch unter UNIX eine ähnliche Lösung geben
 

Basti91

Mitglied
Letztendlich gibt der User Name, Pfad und Version des Projekts an woraus die pom.xml Dateien dynamisch erstellt werden.
Daraufhin soll der User einfach das Builden des Maven Projekts anstoßen wodurch das Kommando im Hintergrund zusammengebaut und ausgeführt wird.
Anschließend soll dann noch die Möglichkeit bestehen das Projekt per Sonar zu reviewen (selbes Kommandoproblem).

Unter Windows habe ich die Kommandoausführung wie im ersten Post beschrieben gehandhabt.
Jedoch hatte sich da keine Kommandozeile geöffnet sondern der Befehl wurde einfach ausgeführt.
Daher hatte ich unter Windows auch während der Ausführung die cmd ausgelesen und in einer TextArea ausgegeben.


Hier nochmal der Windows Code:
Java:
ProcessBuilder builder = new ProcessBuilder( "cmd","/c","archetype:create -DgroupId=GROUPID -DartifactId=ARTIFACTID");
        try {
            Process p = builder.start();
        } 
        catch (IOException e) {
            e.printStackTrace();
        }
 

Effad

Mitglied
Mal direkt aus einem Projekt von mir, das kannst evtl. auf deine Bedürfnisse anpassen.
Wenn du extern ein Programm ausführst, musst du die Ausgaben (stdout, stderr) "abfangen" und irgendwie verarbeiten. Wichtig! pb.redirectErrorStream(true), sonst kriegst stderr nicht.

In meinem Fall logg ich die Dinger einfach raus (LOGGER.verbose)

Java:
	private void bash(String cmd, File cwd) throws MigratorException {
		if (System.getProperty("os.name").startsWith("Windows")) 	return;
		try {
			ProcessBuilder pb = new ProcessBuilder("bash", "-c", cmd);
			if (cwd != null) {
				pb.directory(cwd);				
			}
			pb.redirectErrorStream(true);
			Process pr = pb.start();
			BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));
			
			String line=null;
			
			while((line=input.readLine()) != null) {
				LOGGER.verbose("bash>" + line);
			}
			
			int exitVal = pr.waitFor();
			if (exitVal != 0) {
				throw new Error("Failure while executing bash command '" + cmd + "'. Return code = " + exitVal); 
			}
		}
		catch (Exception e) {
			throw new Error("Could not execute bash command '" + cmd + "'.", e);
		}
	}
 

Basti91

Mitglied
Ich muss mich entschuldigen, der vorschlag von Ark den mvn-Befehl einfach zu splitten funktioniert doch.

Hier mein Code:
Java:
public String generate_maven_project(){
		String cmd_output="";
	    ProcessBuilder builder = new ProcessBuilder( "mvn","archetype:create","-DgroupId=GROUPID","-DartifactId="+ARTIFACTID); //executing the command to build maven project"
	    builder.directory( new File(path) ); 

		try {
			Process p = builder.start();
		    Scanner s = new Scanner( p.getInputStream() ).useDelimiter( "," ); ; 
		    cmd_output =s.next().toString();
		} 
		catch (IOException e) {
			e.printStackTrace();
		} 
		return cmd_output;
	  }

Die Methode führ das Builden eines maven Projektes durch, liest die Shell aus und gibt sie im String cmd_output zurück (cmd_output da es zuerst ein Windowsprogramm war).
Ein kleines Problem habe ich hier jedoch noch: Unter Windows habe ich als Delimiter "//Z" benutzt was auch wunderbar funktioner hat.
Leider funktioniert "//Z" unter UNIX garnicht weshalb ich nach kurzer Recherche "," verwende.
Bei "," wird nun aber nicht die ganze Shell ausgelesen sondern nur ca 15 Zeilen.
Weiss jemand was ich als Delmiter benutzten kann um die gesamte Shell auszulesen?
 
B

bygones

Gast
@bygones: das kommt mir aber für den User zu umständlich vor. Wenn es doch unter Windows funktioniert muss es doch auch unter UNIX eine ähnliche Lösung geben

wie bitte ?

was soll fuer den user denn so schwer sein "mvn bastisplugin" einzugeben ?

mach ein shellscript mit diesem Befehl drin, dann eben.

Ist meiner Ansicht nach absoluter Unsinn Maven in irgendein Programm so umzubiegen....
 

Basti91

Mitglied
Das Programm erstellt die pom.xml automatisch, kann daraus ein Maven Projekt erstellen und dann auch Sonar über das Maven Projekt laufen lassen.
Das alles in einen Programm erscheint mir für Benutzer die nichts mit der Shell am Hut haben, aber trotzdem Code reviewen wollen schon nützlich, bzw für Shell-Kundige ein schnellerer Weg.
 

Ark

Top Contributor
Leider funktioniert "//Z" unter UNIX garnicht weshalb ich nach kurzer Recherche "," verwende.
Bei "," wird nun aber nicht die ganze Shell ausgelesen sondern nur ca 15 Zeilen.
Weiss jemand was ich als Delmiter benutzten kann um die gesamte Shell auszulesen?
Da ich kein Maven verwende, kann ich leider nicht einmal erahnen, was genau du damit bezwecken willst. Was bringt es denn, die komplette Ausgabe zu puffern? Und was hast du ausgerechnet mit dem Komma vor? Ich vermute mal, dass in deinem Fall die Ausgabe genau vor dem ersten Komma, das dann hätte kommen sollen, aufgehört hat. ;)

Wenn du mehr haben willst, musst du [c]Scanner.next()[/c] entsprechend oft aufrufen. Ein Scanner ist aber eigentlich dazu da, tokenweise einzulesen. Wenn du einfach nur "alles" haben willst, ist ein Scanner wahrscheinlich die falsche Wahl. Effads Vorschlag solltest du dir da auch einmal genauer ansehen (da wird nämlich stur zeilenweise vorgegangen). [c]LOGGER.verbose()[/c] kannst du da getrost durch etwas anderes ersetzen, wenn du magst, z.B. durch das Schreiben in eine Datei (oder halt Anhängen an einen StringBuilder, wenn es unbedingt sein muss).

Ark
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Aufruf von Unix-Shell in Java Allgemeine Java-Themen 5
G Unix Passwort mit Java ändern? Allgemeine Java-Themen 3
Oliver530 Speicherort UNIX Allgemeine Java-Themen 10
B Methode läuft nicht unter UNIX Allgemeine Java-Themen 6
TiME-SPLiNTER Von Unix, InputStreams und Null Bytes Allgemeine Java-Themen 2
B Unix-Timestamp > Date macht Probleme. Allgemeine Java-Themen 3
D Unix/Linux Benutzer-Authentifikation über Java Allgemeine Java-Themen 3
S unter UNIX - (symbolic) links erkennen? Allgemeine Java-Themen 12
B GregorianCalendar UNIX Allgemeine Java-Themen 6
M 2 Java-Interfaces öffnen in Unix Allgemeine Java-Themen 4
M neue Textdatei DOS/Unix-Format Allgemeine Java-Themen 11
G Problem mit charva unter UNIX Allgemeine Java-Themen 3
Q || Wie speichert man Dateien wo der Pfad als Link(UNIX)... Allgemeine Java-Themen 11
S Unix Dateiinformationen Allgemeine Java-Themen 4
P Copy mit Runtime.exec() unter Unix Allgemeine Java-Themen 4
A Unix Zeit Allgemeine Java-Themen 2
F Prüfen, ob Windows oder UNIX Allgemeine Java-Themen 2
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
S Shell Commands mit absolutem Pfad ausführen Allgemeine Java-Themen 2
D Shell Script mit Parametern Allgemeine Java-Themen 2
R Batch / Shell-Skript in Jar.Datei einbinden? Allgemeine Java-Themen 5
Semox "Gute" Rückgaben von bash Shell ausgeben Allgemeine Java-Themen 4
S Shell-Befehl: mail Allgemeine Java-Themen 6
I Problem beim Ausführen von Shell Commandos Allgemeine Java-Themen 3
D Shell-Prozess lässt Thread nicht enden Allgemeine Java-Themen 4
D Java Anwendung in der Shell Allgemeine Java-Themen 5
T Shell befehle ausführen - wie? Allgemeine Java-Themen 2
K Shell Command Auslesen Allgemeine Java-Themen 3
S Überprüfen, ob ein Shell Befehl existiert! Allgemeine Java-Themen 4
G Windows Shell Umlaute Problem Allgemeine Java-Themen 19
D linux shell aus java öffnen Allgemeine Java-Themen 5
Ark Linux: Shell-Skript zum Kompileren und Starten Allgemeine Java-Themen 4
thE_29 Kontextmenü Shell Eintrag Allgemeine Java-Themen 35
C Shell in einer GUI erstellen Allgemeine Java-Themen 2
F Shell-Programme per Runtime.exec() starten und mehr? Allgemeine Java-Themen 4
M DOS-Shell kennt kein CP850!! Allgemeine Java-Themen 2
O Java via Korn-Shell Allgemeine Java-Themen 8
C shell befehl mit java ein- und auslesen Allgemeine Java-Themen 2
N Validator für einen SQL-Befehl Allgemeine Java-Themen 22
J CMD Befehl in Java Consolenprogramm ausführen Allgemeine Java-Themen 6
T Konsolen-Befehl junk Allgemeine Java-Themen 2
Joker4632 Methoden Befehl an bereits extern geöffnete Programm-spezifische Konsole senden Allgemeine Java-Themen 1
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
F Create Befehl mit variierender Spaltenanzahl/Spaltenname Allgemeine Java-Themen 5
E String in Zahl umwandeln, ohne Befehl Integer.parseInt Allgemeine Java-Themen 3
D Klassenübergreifender Befehl geht nicht Allgemeine Java-Themen 10
T DLL Befehl Funktionsparameter Allgemeine Java-Themen 6
H FTP Befehl/Java Methode für Submit im z/Os (Host) Allgemeine Java-Themen 1
B Zeitmessen Befehl sende und empfagen Allgemeine Java-Themen 10
G Befehl funktioniert in Eclipse allerdings nicht in einer Jar-Datei Allgemeine Java-Themen 3
J java zurück befehl Allgemeine Java-Themen 18
iB0T "goto" Befehl aus Batch in Java und Variablen wert immer wieder neu setzen Allgemeine Java-Themen 4
M Befehl in Runtime ausführen der Eingabe benötigt Allgemeine Java-Themen 3
T Java Programm als Batch Befehl Allgemeine Java-Themen 6
K der Befehl "runas" Allgemeine Java-Themen 13
Jats Programm mit CMD Befehl hängt sich auf oder gibt error = 5 aus Allgemeine Java-Themen 4
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
M String in Befehl umwandeln Allgemeine Java-Themen 10
G CMD befehl: BAT erstellen, reinschreiben und starten? Allgemeine Java-Themen 12
S Suche Pendant zu einem VB Befehl Allgemeine Java-Themen 2
P SQL Befehl Allgemeine Java-Themen 15
G Befehl an OS X cmd Allgemeine Java-Themen 7
L mit exec() befehl ausführen ( OS X / Linux) Allgemeine Java-Themen 8
T jar mit Befehl zur Vergrößerung des VM-Speichers Allgemeine Java-Themen 11
S mit welchem befehl kann ich mein programm autom. schließen Allgemeine Java-Themen 3
A Zusammenfassen von zwei Dateien (wie beim DOS-Befehl copy) Allgemeine Java-Themen 6
S String als Befehl interpretieren Allgemeine Java-Themen 2
S GetColor? anderer befehl Allgemeine Java-Themen 13
M Methode x mal ausführen auf Befehl Allgemeine Java-Themen 7
L linux befehl aus java programm starten Allgemeine Java-Themen 7
M Unter MacOS einen Befehl auf Konsole ausführen? Allgemeine Java-Themen 6
G JDK Version - exec Befehl Allgemeine Java-Themen 3
M Befehl unter Win98 ausführen? Allgemeine Java-Themen 3
M Befehl aus Anwendung starten Allgemeine Java-Themen 7
B befehl "java" wird nicht gefunden Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben