Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
ich rufe innerhalb meines Java Programmes eine .bat auf:
Process p = Runtime.getRuntime().exec("cmd.bat");
Das funktioniert aus Eclipse ohne Probleme.
Nun habe ich das Eclipse Projekt exportiert, und eine .jar daraus gemacht.
Die Datei cmd.bat wird aus der .jar aber nicht mehr aufgerufen.
Wo muss ich die datei cmd.bat hin kopieren, damit sie auch aus der .jar aufgerufen werden kann?
Das ist erst einmal prinzipiell egal. Aber Du solltest Dir ein Verzeichnis suchen, auf das der User Schreibrechte hat. Neben die .jar Datei ist aus meiner Sicht ganz schlecht, denn Applikationen liegen halt gerne mal an Stellen, auf die ein normaler Nutzer eben keine Schreibrechte hat!
Was mir da so einfallen würde wäre:
- Erstellung von Installern - dann hast Du sicher gestellt, dass die Applikation richtig installiert wird an den Ort, an den der User/Admin es gerne hätte. Und dann wird da halt jar und bat und was weiss ich noch alles direkt hinterlegt. Das hat den Vorteil, dass da auch eine Deinstallation möglich ist.
- Du machst Das alles selbst, d.h. zur Laufzeit erstellst Du die .bat und was Du ggf. sonst noch so brauchst. Hat aus meiner Sicht den großen Nachteil, dass hier dann die Deinstallation nicht gegeben ist und die Anwender haben da dann immer mehr Müll auf dem System.
Danke für die Antworten, leider findet meine .jar die .bat nicht, auch wenn sie direkt "neben ihr" ( also im gleichen Ordner) liegt.
Die Szenerie ist folgende:
Zuerst schreibe ich einen Text in meine .bat file:
Java:
RESULT = write_batFile("cmd.bat");
public int write_batFile(String batfile) {
try {
fw = new FileWriter(batfile);
fw.write("hierschreibeich sinnvollen text...");
} catch (IOException e) {
e.printStackTrace();
return WRITE_NOT_OK;
}
finally {
if ( fw != null )
try { fw.close(); } catch ( IOException e ) { e.printStackTrace(); }
}
return WRITE_OK;
}
Dann rufe ich die .bat file auf:
Process p = Runtime.getRuntime().exec("cmd.bat");
mein "normales" Eclipse führt auch alles correct aus, die .bat "cmd.bat" wird beschrieben und ausgeführt, sie dabei im Projektordner.
Die .jar aber beschreibt weder die .bat, noch führt sie sie aus.
Also ich würde nicht einfach so ohne Pfad eine Datei anlegen. Ich würde diese Datei - wie bereits gesagt - im temp Ordner unterbringen.
Aber um das Verhalten zu erkennen kannst Du ja mal den aktuellen Pfad ausgeben:
Paths.get(".").toAbsolutePath().normalize().toString() könntest Du ja mal testweise ausgeben.
Ich habe ein Eclipse Programm geschrieben, das Auf Knopfdruck folgende Funktion ausführt:
Mein Eclipse Programm schreibt in ein .bat file die Aufforderung, ein sich auf dem Rechner befindliches Programm mit bestimmten Übergabeparametern zu starten.
Diese .bat erscheint dann auch im angegebenen Pfad C:/app/tools
Danach startet mein Eclipse diese .bat, welche dann auch korrekt ihre Arbeit erledigt (das Auf dem Rechner befindliche Programm mit gewissen Übergabeparametern zu starten)
Danach estelle ich eine Ausführbare Datei aus meinem Eclipse Projekt mit:
Export - Runnable JAR file - Extract required libraries into generated JAR
Diese .jar lege ich auf meinen Desktop ab, und starte sie per doppelkick.
Das Programmfenster öffnet sich, ich drücke den Knopf, und dann tut sich nichts mehr:
- keine .bat erscheint im Pfad C:/app/tools ergo es wird keine .bat geschrieben
- das auf dem Rechner befindliche Programm kann also auch nicht durch den Funktionsaufruf getRuntime() gestartet werden
Debuginfos nutzen mir nichts, da ja das Eclipse Programm wunderbar funktioniert, also ich dort keine Fehler debuggen kann.
Dies ist mein Eclipse Quellcode:
Java:
String passw = "12345";
String usrnm = "meinName";
//schreibe .bat file
RESULT = write_batFile("C:\\app\\tools\\cmd.bat");
//falls das schreiben funktioniert hat
if(RESULT == WRITE_OK) {
try {
//rufe die .bat auf
Process p = Runtime.getRuntime().exec("C:\\app\\tools\\cmd.bat");
} catch (Exception e) {
System.err.println(e.toString());
}
} else {
System.out.println("Schreiben der bat file ist schiefgelaufen");
}
public int write_batFile(String batfile) {
try {
fw = new FileWriter(batfile);
fw.write("C:\\app\\tools\\IBM\\Doors\\9.3\\bin\\doors.exe -data \"36677@krs-doorsdat.emea.zf-world.com\" -batch \"C:\\app\\tools\\IBM\\DOORS\\9.3\\bin\\createExtLink.dxl\" " + "-user " + usrnm + " -password "+passw);
} catch (IOException e) {
e.printStackTrace();
return WRITE_NOT_OK;
} finally {
if ( fw != null ) {
try {
fw.close();
} catch ( IOException e ) {
e.printStackTrace();
}
}
}
return WRITE_OK;
}
Also da Du nicht scheinbar nicht weist, wo genau was als Fehler auftritt, dürften Debug-Informationen eben doch von Interesse sein. In dem Code, den Du da zeigst, sehe ich kein Problem, welches das von Dir beschriebene Szenario erklären könnte.
Was mir auffällt ist, dass fw scheinbar eine Instanzvariable ist. Das ist evtl. unüblich, da Du die Variable ja nur lokal brauchst, daher hätte ich die in der Funktion selbst definiert (also vor dem try in dem Du den FileWriter erstellst ein FileWriter fw; Aber das ist nichts, das zu so einem Problem führen könnte.
ich habe herausgefunden, dass meine .jar schon früher aussteigt:
bevor die .bat manipulation läuft, beschreibe ich noch ein txt file.
dazu wird ein neues file angelegt, ein paar zeilen beschrieben, und dann aus einem bestehenden File (originalfile) der rest in das neue file kopiert.
das dxl file wird estellt, aber anscheinend findet die .jar das originalfile nicht.
in Eclipse liegt das originalfile im Projektpfad, da habe ich keine Probleme.
Wo muss ich das originalfile hinkopieren, damit auch die .jar sie findet? ich hätte das originalfile am liebsten in der .jar hineinkompiliert (wegen der Manipulationssicherheit) anstatt es z.B. unter c/temp abzulegen.
hier noch der code:
Java:
RESULT = write_dxl_file("C:/app/tools/IBM/DOORS/9.3/bin/createExtLink.dxl","fileWriter.txt");
public int write_dxl_file(String dxlfile, String originfile) {
try {
fw = new FileWriter(dxlfile );
fw.write( "string strLink = "+strLink+"\n" );
fw.append( "string strView = "+strView+"\n" );
fw.append( "string strDesc = "+strDesc +"\n");
fw.append( "string strName = "+strDesc +"\n\n");
//hier scheint die .jar das originalfile nicht zu finden und steigt aus
in = new BufferedReader(new FileReader(originfile));
String zeile = null;
while((zeile = in.readLine()) != null){
fw.append(zeile+"\n");
}
} catch ( IOException e ) {
System.err.println( "Konnte Datei nicht erstellen" );
return WRITE_NOT_OK;
} finally {
if ( fw != null )
try { fw.close(); } catch ( IOException e ) { e.printStackTrace(); }
if (in != null)
try {
in.close();
} catch (IOException e) {
}
}
return WRITE_OK;
}
habs ausprobiert, indem ich filewriter.txt unter c/app/tools abgelegt und enstprechend den Aufruf angepasst habe.
dann läuft meine .jar durch, und ruft danach auch die .bat auf...
Java:
RESULT = write_dxl_file("C:/app/tools/IBM/DOORS/9.3/bin/createExtLink.dxl","C:/app/tools/fileWriter.txt");
aber wie schon erwähnt:
wie bekomme ich die fieleWriter.txt in die .jar reincompiliert?
Wichtig ist, dass der Pfad dann relativ angegeben werden muss:
- bei Class.getResourceAsStream von der Klasse aus.
- bei ClassLoader.getResourceAsStream vom ClassPath aus.
oder eben mit führendem "/" und dann gilt es vom Classpath aus.
Wenn die Datei also "test.txt" heisst und im jar im ordner resources liegt, dann kannst Du darauf zugreifen per "/resources/test.txt".