# JAR File aus dem Quellcode ausführen



## mdunker (20. September 2010)

Hallo,

ich habe eine Anwendung die einen kleinen Server benötigt. Dieser Server ist ein einfaches jar das auf der Konsole mit java -jar name.jar gestartet werden kann.

Ich möchte dieses JAR jetzt aus meinem Quellcode starten. Ich habe mir auch schon eine Lösung gebastelt mit der ich aber noch nicht ganz zufrieden bin.


```
public class SeleniumServer extends Thread {

	private static Logger logger = Logger.getLogger(SeleniumServer.class
			.getName());

	public static void main(String args[]) {
		SeleniumServer t = new SeleniumServer();
		t.start();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Thread#run()
	 */
	public void run() {
		try {
			String line;
			File pfad = new File("");
			Process p = Runtime.getRuntime().exec(
					pfad.getAbsolutePath() + "\\" + "startSelenium.cmd");
			BufferedReader input = new BufferedReader(new InputStreamReader(p
					.getInputStream()));
			while ((line = input.readLine()) != null) {
				logger.info(line);
			}
			input.close();
		} catch (Exception err) {
			err.printStackTrace();
		}
	}
}
```

startSelenium.cmd sieht so aus:

```
cd lib
java -jar selenium-server.jar
```

Mein größtest Problem dabei ist, das ich nicht weiß wie ich den Server wieder beenden kann. Außerdem finde ich die Lösung mit der .cmd Datei unschön. 

Wenn ich den Server über die Konsole starte kann ich ihn mit Strg-C beenden. Ich dachte jetzt an eine Lösung wo ich alle Befehle an die Runtime übergebe und wenn ich fertig bin halt noch Strg-C, wenn möglich. Ansonsten könnte ich evtl. auch den Thread beenden?

Ich bin offen für alle Ideen und Ratschläge wie ich das jar eleganter starten kann und vor allem wie ich den Server beenden kann wenn ich nicht mehr benötige.

THX


----------



## Thomas Darimont (20. September 2010)

Hallo,

schau mal hier:

```
package de.tutorials.training;

import java.util.Scanner;
import java.util.concurrent.TimeUnit;

public class StartSeleniumExample {
	public static void main(String[] args) throws Exception {
		ProcessBuilder pb = new ProcessBuilder("java", "-jar",
				"C:/development/java/tools/selenium-server-1.0.3/selenium-server.jar");
		Process process = pb.start();

		readInputFrom(process);

		TimeUnit.SECONDS.sleep(5);

		System.out.println("bye bye selenium");

		process.destroy();

		System.out.println("exit");
	}

	private static void readInputFrom(final Process p) {
		new Thread() {

			{
				setDaemon(true);
			}

			@Override
			public void run() {
				Scanner scanner = new Scanner(p.getInputStream());
				while (scanner.hasNextLine()) {
					System.out.println(scanner.nextLine());
				}
			}
		}.start();
	}
}
```

Gruß Tom


----------



## Saylim (21. September 2010)

Hi Tom,

danke für Deine Lösung. Sehr elegant und scheint seinen Zweck zu erfüllen. 

Danke für die Mühe!


----------



## zer0 (21. September 2010)

Thomas Darimont hat gesagt.:


> Hallo,
> 
> schau mal hier:
> 
> ...


 
Hey,

könnte mir vllt jemand den Quellcode erklären, für was z.B. ist readInputFrom(), ich weiß das es was einliest, aber warum hast du das so gemacht?

Gruß


----------



## thorsti09 (21. September 2010)

In der Regel möchte man ja nicht nur die entfernte .jar-Datei ausführen, sondern sich auch noch deren Ausgaben anzeigen lassen. Und dafür ist die readInputFrom-Methode. Sie erzeugt einen neuen Thread, der den InputStream des Prozesses auf neue Zeilen überwacht und diese dann auf der Konsole ausgibt. 
Der Thread wird hier als Dämon gekennzeichnet, da er lediglich im Hintergrund agiert. Wenn das Hauptprogramm beendet ist und die Laufzeitumgebung erkennt, dass kein normaler Thread (user thread) mehr läuft, dann bedeutet das automatisch das Ende für einen Dämon (selbst wenn dieser noch nicht terminiert hat).

Gruß,

Thorsten


----------



## zer0 (21. September 2010)

Danke für die gute Erklärung!


----------

