Aufruf einer Batchdatei aus JAVA-Programm

1.) Wie rufe ich eine Batch-Datei oder ein externes Programm
aus einem Java-Programm auf?

2.) Kann ich aus einem Java-Programm auf der „Shell“-Ebene Befehle ausführen??
Z.B) - öffne DOS-Shell

  • mache: copy *.* c:\temp
  • schließe DOS-Shell

1.) Wie rufe ich eine Batch-Datei oder ein externes Programm
aus einem Java-Programm auf?

Ein externes Programm kannst du über das Runtime-Objekt ausführen. Hier gibt es z.B. den Befehl exec. Dadurch bist du aber nicht mehr plattformunabhängig, aber das wird dir bei solchen Absichten vermutlich selber klar sein. SUN rät von solchen Vorhaben streng ab (siehe auch http://java.sun.com/docs/books/tutorial/essential/sy…).

Für jede Applikation gibt es nur ein Runtime-Objekt. Dieses kannst du über

Runtime.getRuntime()

bekommen.

Es gibt an

2.) Kann ich aus einem Java-Programm auf der „Shell“-Ebene
Befehle ausführen??
Z.B) - öffne DOS-Shell

  • mache: copy *.* c:\temp
  • schließe DOS-Shell

Dateiein kannst du auch ganz einfach aus Java heraus machen. Temporäre Kopien kannst du z.B. über das File-Object erstellen mit

File.createTempFile(String prefix, String suffix)

Dirk

Danke Dirk,
ich möchte natürlich Plattformunabhängig bleiben.
Eigentlich möchte ich von einem Java-Programm mit eigenem
Main() ein anderes Java-Programm aufrufen, was ebenfalls eine Main-Funktion besitzt.
Welche Möglichkeit habe ich denn, um weiterhin Plattforunabhängig zu bleiben??

Ein externes Programm kannst du über das Runtime-Objekt
ausführen. Hier gibt es z.B. den Befehl exec. Dadurch bist du
aber nicht mehr plattformunabhängig, aber das wird dir bei
solchen Absichten vermutlich selber klar sein. SUN rät von
solchen Vorhaben streng ab (siehe auch
http://java.sun.com/docs/books/tutorial/essential/sy…).

Servus Fabian,

ich möchte natürlich Plattformunabhängig bleiben.
Eigentlich möchte ich von einem Java-Programm mit eigenem
Main() ein anderes Java-Programm aufrufen, was ebenfalls eine
Main-Funktion besitzt.
Welche Möglichkeit habe ich denn, um weiterhin
Plattforunabhängig zu bleiben??

ein anderes Java-Programm besteht natürlich haupsächlich wieder aus einer ganz normalen Java Klasse. Die main-Methode dieser Klasse ist eigentlich auch nur eine ganz normale Methode, die auch so aufrufen kannst. Das in args[] deine Parameter aus der Kommandozeile stehen, dafür sorgt das java.
Da diese methode static, also objektinvariant ist, kannst du diese Methode auch aufrufen, ohne ein Objekt davon zu erstellen (sollte man eigentlich bei static-Methoden immer so machen).
D.h, du kannst die main-Methode nach folgendem Schema aufrufen:

String[] args = new String[n];
args[0] = "Option1";
args[1] = "Option2";
...
AnotherClass.main(args);

Ein wenig komplizierter wird es halt, wenn du das ganze Asynchron ablaufen lassen möchtest. Da wirst du dann Threads benötigen.

Dirk

Hallo Dirk,
ich denke, Dein Hinweis kann mich weiterbringen, allerdings
habe ich meine JAVA-Klasse nur als *.Class vorliegen (die wiederrum auf andere Libraries zurückgreift).
D.h. ich habe den Code nicht dazu.
Alles, was ich als Parameter innerhab meines Programmes
zur Verfügung habe ist, wo (unter welchem Pfad) sich diese
Class-File befinde und die entsprechenden „args“, die diese
Classfile benötigt.

Woher kennt mein Java-Programm von dieser Klasse??
Oder soll ich diese importieren (import PATH\ClassName.*)?

Gruß

D.h, du kannst die main-Methode nach folgendem Schema
aufrufen:

String[] args = new String[n];
args[0] = „Option1“;
args[1] = „Option2“;

AnotherClass.main(args);

Servus Fabian,

ich denke, Dein Hinweis kann mich weiterbringen, allerdings
habe ich meine JAVA-Klasse nur als *.Class vorliegen (die
wiederrum auf andere Libraries zurückgreift).
D.h. ich habe den Code nicht dazu.
Alles, was ich als Parameter innerhab meines Programmes
zur Verfügung habe ist, wo (unter welchem Pfad) sich diese
Class-File befinde und die entsprechenden „args“, die diese
Classfile benötigt.

Woher kennt mein Java-Programm von dieser Klasse??
Oder soll ich diese importieren (import PATH\ClassName.*)?

Dann hast du doch alles, was du brauchst. Du musst allerdings noch die Klasse, die du afrufen willst, in deinem CLASSPATH bekannt machen. Dann kannst du diese Klasse, wie oben beschrieben einfach benutzen.

Dirk

Habe diese „externe Klasse“ in ein jar gepackt. Diese habe ich
Im CLASSPATH eingetragen und meinem Projekt beigefügt.
Beim Import import Anotherclass; der Klasse und compilieren bekomme ich folgende
Fehlermeldung an der import-stelle:
Error #: 361: class required, but identifier found
Verstehe nicht, warum das so kompliziert ist…bin völlig verzweifelt!

Dann hast du doch alles, was du brauchst. Du musst allerdings
noch die Klasse, die du afrufen willst, in deinem CLASSPATH
bekannt machen. Dann kannst du diese Klasse, wie oben
beschrieben einfach benutzen.

Dirk

Hallo!

Um dir zu helfen brauche ich folgendes:

Alle Pfadangaben

  • wo stehen die Klassen
  • wie ist der CLASSPATH
  • welche Struktur hat die JAR-Datei

Dein Programm-Code , aber nicht alles, sondern nur bis zur stelle public class …

Ich oder ein anderer kluger Kopf in diesem Brett wird dir dann bestimmt sehr schnell helfen können.

Gruß, Franz

Hallo Franz,

  • wo stehen die Klassen

Sie stehen alle in einem Ordner.
Es handelt sich um eine CLASS-Datei (MyClass.class) mit einer Main-Fkt.
Diese importiert weitere Klassen, die in Form einer jar (MyJar.jar) im selben
Ordner vorliegen.
Sie liegen alle im C:\MyProg

  • wie ist der CLASSPATH

Das habe ich im System eingerichtet.
C:\myPro\MyJar.jar;C:\MyPro\MyClass.jar;

  • welche Struktur hat die JAR-Datei

Da ich keine Möglichkeit habe, unter
JBuilder3.0 Foundation eine *.class-Datei zu importieren,
habe ich aus der einen Klasse eine JAR gemacht, wie folgt:
jar cvf MyClassJar.jar MyClass.class

Dein Programm-Code, aber nicht alles, sondern nur bis zur stelle public class …

Beim Eingeben der Import bekomme ich eine

import java.util.*;
import java.io.*;
import MyClass;

public class SeqCheck extends Object implements Runnable {

}

Danke Gruß

Zusatz!!!
Es wäre toll, wenn jmd. mir auf diesem Wege helfen kann (s.Artikel oben), jedoch brauche ich zunächst mal unbedingt eine Lösung.

So versuchte ich über einen „externen Aufruf“ innerhalb meines
Javaprogrammes das andere Programm zu starten…leider klappte dies auch nicht!!!

Mein Aufrufcode:

_String sExec;
String sParameter = „File.txt“;

sExec = "java MyProg " + sParameter;

Runtime.getRuntime().exec(sExec);_

Leider passiert auch hier nix! (MyProg ist bereits im CLASSPATH eingetragen)

Hallo!

Ich kann ehrlich gesagt den Fehler nicht erkennen. Ich habe das mal nachgebaut und bei mir klappt das. Ich vermutete den Fehler bei der sache mit dem jar-file. War aber nicht so.
Mal abgesehen davon, dass du dateien, die im selben verzeichnis liegen, nicht mit import laden musst. Aber das stört auch nicht.
Wenn du packages benutzt, dann musst du das überall tun. Da du keine benutzt ist das auch nicht das Problem. Oder sind welche in deinem anderen jar-file?

Ich verstehe auch nicht, wieso du extra eine jar-datei machst, um sie in jbulder zu importieren. Das muss doch auch anders gehen.

Mir fehlen noch infos, aber welche???
Ich überlege noch. Vielleicht weiss es ein anderer.

Franz

Hallo Franz,

ich habe mir das auch nachgebaut und es funktioniert
mit meiner Lösung. Nur mit dieser externen Klasse irgendwie nicht.
Habe sogar versucht die Classe zu Decompilieren (danke für den Link oben :smile:, um zu sehen, warum es mit der Klasse nicht geht…
Nicht mal das klappte, da ein KlassenVersionsKonflikt vorliegt.
Meine letzte Chance, diese Klasse zu benutzen bleibt vorerst,
daß ich diese als „externen Aufruf“ behandle…
Kannst Du mir auf meine „Zusatzfrage“ (s.Unten) eine Antwort geben.

Verbindlichen Dank :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]