# class-Dateien ausführen



## thomy800 (20. Mai 2008)

Hi

ich möchte ein Programm schreiben, welches andere Java-Programme startet. Ich habe schon überlegt dies so zu machen:


```
Runtime.getRuntime().exec("cmd.exe "+startargumente);
```

allerdings haperts schon bei den Startargumenten.

Ich habe das mal manuell in der cmd.exe versucht: 
	
	
	



```
java <Pfad zur Klasse, wo main drin ist>
```
 aber schon da bekomme ich den Fehler 
	
	
	



```
Exception in thread "main" java.lang.NoClassDefFoundError: <Pfad>
```

Ziel ist es, die class-Dateien von den Programmen auszuführen, indem ich den Pfad der Dateien an cmd.exe sende. Weiß jemand was ich falsch mache?

MfG thomy


----------



## shutdown (20. Mai 2008)

Zum Beispiel, dass cmd keine Class-Dateien starten kann?
Ausführen musst du das ganze über java.exe.

Desweiteren wirst du ein Problem mit verschiedenen Ordnerstrukturen usw. haben. Evtl. ist es erst erforderlich in ein bestimmtes Verzeichnis über den Ordnern zu wechseln, um das Programm mit dem richtigen Class-Path starten zu können.


----------



## zeja (20. Mai 2008)

Versuch mal nen Ausführungsverzeichnis mit zu setzen:

```
public Process exec(String[] cmdarray,
                    String[] envp,
                    File dir)
```

Also:

```
Runtime.getRuntime().exec(new String[]{"java","package.Class"},null,new File("execDir"));
```
Ab Java 1.5 bitte ProcessBuilder verwenden.


----------



## thomy800 (20. Mai 2008)

Naja, cmd.exe verwende ich ja nur um java.exe zu starten.

Und müsste das mit den Ordnungstrukturen nicht egal sein, wenn ich den absoluten Pfad der java.exe übergebe?

edit:
Habe das jetzt mit dem Processbuilder probiert, aber es passiert nichts:

```
ProcessBuilder pb = new ProcessBuilder("java","D:\\start1\\start.class") ;
            pb.start();
```


----------



## shutdown (20. Mai 2008)

> Und müsste das mit den Ordnungstrukturen nicht egal sein, wenn ich den absoluten Pfad der java.exe übergebe



Leider nein, die Abhängigkeiten der Klassen untereinander ist relativ, darum kommt es auf das Verzeichnis an, in dem du dich gerade befindest, während du das ausführst.

So hat es sich zumindest immer bei mir dargestellt - lasse mich gerne eines besseren belehren.

Und wenn schon cmd.exe dann cmd /c - startet ein Konsolenfenster, dass sich gleich wieder nach Ausführen des Befehls schließt. Das ist aber unnötig, du kannst auch direkt java.exe ansprechen.


----------



## thomy800 (20. Mai 2008)

Ok, ich seh jetzt gar nicht mehr durch^^

Also, ich habe den <Pfad a> wo meine momentane <class start> ausgeführt wird. Diese soll nun die <class exc> starten, welche sich bei <Pfad b> befindet. Wie sähe nun der Befehl, der in <class start> steht, aus?


----------



## zeja (20. Mai 2008)

Versuch das:

```
package de.tutorials;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class JavaApplicationStart {

	private static void startJavaApplication(File execDir, String mainClass) {
		ProcessBuilder b = new ProcessBuilder("java", mainClass);
		b.directory(execDir);
		b.redirectErrorStream(true);
		try {
			// Starten
			final Process p = b.start();

			// Ausgabe lesen
			final InputStream processOutput = p.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(
					processOutput));
			String line;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		// Starte die Klasse de.tutorials.HelloWorld im Ausführungsverzeichnis
		// bin
		startJavaApplication(new File("bin"), "de.tutorials.HelloWorld");
	}

}
```


```
package de.tutorials;

public class HelloWorld {

	public static void main(String[] args) {
		System.out.println("Hello World");
	}

}
```

Gibt bei mir wie gewünscht aus:


> Hello World


----------



## thomy800 (20. Mai 2008)

Ich weiß nicht, was ich falsch mache... 
ich habe diese beiden Quelltexte kopiert, einen Order "bin" im Verzeichnis erstellt, wo auch die beiden Klassen sind und trotzdem kommt der Fehler:


```
java.lang.NoClassDefFoundError: HelloWorld
Exception in thread "main"
```


----------



## zeja (20. Mai 2008)

Ordnerstruktur in bin muß der Packagestruktur entsprechen:
bin
 - de
 --- tutorials
  ----- HelloWorld.class


----------



## thomy800 (20. Mai 2008)

test
--JavaApplicationStart.class
--bin
---- de
-------- tutorials
------------- HelloWorld.class
und zusätzlich
--de
-----tutorials
------HelloWorld.class

und trotzdem: 
	
	
	



```
java.lang.NoClassDefFoundError: de/tutorials/HelloWorld
Exception in thread "main"
```

Aber JavaApplicationStart muss nicht in bin sein, oder?


----------



## zeja (20. Mai 2008)

Tu mal folgendes:

```
public static void main(String[] args) {
        File f = new File("bin");
        System.out.println(f.getAbsolutePath());
        // Starte die Klasse de.tutorials.HelloWorld im Ausführungsverzeichnis
        // bin
        startJavaApplication(f, "de.tutorials.HelloWorld");
    }
```

Dann siehst du wo er versucht bin zu finden!


----------



## thomy800 (20. Mai 2008)

also bin findet er:


> .../test/bin



und wenn bin nicht gefunden wird, gibts den Fehler:



> java.io.IOException: CreateProcess: java de.tutorials.HelloWorld error=267
> at java.lang.ProcessImpl.create(Native Method)
> at java.lang.ProcessImpl.<init>(ProcessImpl.java:81)
> at java.lang.ProcessImpl.start(ProcessImpl.java:30)
> ...



also nehm ich mal an, dass das Problem irgendwo bei HelloWorld liegt...


----------



## zeja (20. Mai 2008)

Hast du es so genommen wie ich es gepostet habe und kompiliert?


----------



## thomy800 (20. Mai 2008)

jap, 100%ig kopiert^^


----------



## zeja (20. Mai 2008)

Irgendwas wirst du ja falsch machen.... entweder du suchst selber weiter oder du schreibst hier mal ganz genau was du in welcher Reihenfolge gemacht hast.


----------



## thomy800 (20. Mai 2008)

Ich weiß nicht ob es normal ist, aber wenn ich in die Konsole eingebe:


> java ...\test\bin\de\tutorials\HalloWorld


dann kommt der selbe Fehler. Kann es irgendwie damit zusammenhängen?


----------



## zeja (20. Mai 2008)

Wenn dann müßtest du in der Konsole eingeben:

cd ../test/bin
java de.tutorials.HelloWorld


----------



## thomy800 (21. Mai 2008)

Da kommt der selbe Fehler...


----------

