class-Dateien ausführen

thomy800

Erfahrenes Mitglied
Hi

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

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

allerdings haperts schon bei den Startargumenten.

Ich habe das mal manuell in der cmd.exe versucht:
Code:
java <Pfad zur Klasse, wo main drin ist>
aber schon da bekomme ich den Fehler
Code:
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
 
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.
 
Versuch mal nen Ausführungsverzeichnis mit zu setzen:
Java:
public Process exec(String[] cmdarray,
                    String[] envp,
                    File dir)

Also:
Java:
Runtime.getRuntime().exec(new String[]{"java","package.Class"},null,new File("execDir"));
Ab Java 1.5 bitte ProcessBuilder verwenden.
 
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:
Java:
ProcessBuilder pb = new ProcessBuilder("java","D:\\start1\\start.class") ;
            pb.start();
 
Zuletzt bearbeitet:
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.
 
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?
 
Versuch das:
Java:
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");
	}

}

Java:
package de.tutorials;

public class HelloWorld {

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

}

Gibt bei mir wie gewünscht aus:
 
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:

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


:mad:
 
Zuletzt bearbeitet:
Ordnerstruktur in bin muß der Packagestruktur entsprechen:
bin
- de
--- tutorials
----- HelloWorld.class
 
test
--JavaApplicationStart.class
--bin
---- de
-------- tutorials
------------- HelloWorld.class
und zusätzlich
--de
-----tutorials
------HelloWorld.class

und trotzdem:
Code:
java.lang.NoClassDefFoundError: de/tutorials/HelloWorld
Exception in thread "main"

Aber JavaApplicationStart muss nicht in bin sein, oder?
 
Zurück