Shellscript aus .jar archiv ausführen

Status
Nicht offen für weitere Antworten.

mupilz

Neues Mitglied
huhu,

Ich wurde von einem Bekannten gefragt, ob ich für ihn ein kleines GUI für das wiederherstellen von Dateien/Ordnern mit rdiff schreiben kann.
Das Wiederherstellen an sich übernimmt ein shellscript, das er geschrieben hat, diesem wird nur von dem GUI der Dateipfad als Parameter übergeben.
Alles klappt, bis zu dem Zeitpunkt, wo ich alles in ein .jar archiv reinpacke.
Und zwar:
Das Script liegt in einem Unterordner "scripts" in dem Archiv, und ich habe keine Ahnung, wie ich darauf zugreifen kann.
ich habe es bereits so probiert:
Java:
java.net.URL scriptURL = getClass().getResource("scripts/makebackup");
Process p = Runtime.getRuntime().exec(scriptURL + " " + path); //in der Variable "path" ist der Pfad zu der wiederherzustellenden Datei abgelegt

das erzeugt aber folgende Fehler:

Code:
java.io.IOException: Cannot run program "jar:file:/home/mato/Desktop/searchBackup.jar!/scripts/makebackup": java.io.IOException: error=2, No such file or directory
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:474)
	at java.lang.Runtime.exec(Runtime.java:610)
	at java.lang.Runtime.exec(Runtime.java:448)
	at java.lang.Runtime.exec(Runtime.java:345)
	at searchBackup.actionPerformed(searchBackup.java:210)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253)
	at java.awt.Component.processMouseEvent(Component.java:6106)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3276)
	at java.awt.Component.processEvent(Component.java:5871)
	at java.awt.Container.processEvent(Container.java:2105)
	at java.awt.Component.dispatchEventImpl(Component.java:4467)
	at java.awt.Container.dispatchEventImpl(Container.java:2163)
	at java.awt.Component.dispatchEvent(Component.java:4293)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
	at java.awt.Container.dispatchEventImpl(Container.java:2149)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4293)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
Caused by: java.io.IOException: java.io.IOException: error=2, No such file or directory
	at java.lang.UNIXProcess.<init>(UNIXProcess.java:164)
	at java.lang.ProcessImpl.start(ProcessImpl.java:81)
	at java.lang.ProcessBuilder.start(ProcessBuilder.java:467)
	... 29 more

Google, mehrere Leute sowie die Boardsuche haben mir keine Lösungen angeboten.

achja, zu der Java Version:
ich benutze Linux, "java -version" spuckt mir folgendes aus:
Code:
java version "1.6.0_0"
OpenJDK  Runtime Environment (build 1.6.0_0-b11)
OpenJDK 64-Bit Server VM (build 1.6.0_0-b11, mixed mode)

und "javac -version" dieses:
Code:
javac 1.6.0_0-internal

Über zumindest einen Lösungsansatz würde ich mich sehr freuen!

ich hoffe, ihr könnt mir weiterhelfen, ich bin schon fast am verzweifeln ;(

mfg mupilz
 
Das funktioniert nicht. Die Shell benötigt das Script als Datei (und nicht innerhalb eines Archivs). Eine Variante wäre, eine temporäre Datei zu erstellen ([c]File.createTempFile()[/c]) und das Script dort reinzuschreiben.
 
ahh, okay

vielen dank, ich hab das Problem gelöst :toll:

Java:
File tmpFile = File.createTempFile("makebackup", ".tmp");
tmpFile.deleteOnExit();
BufferedWriter out = new BufferedWriter(new FileWriter(tmpFile));
out.write("echo \"das klappt ja gut!\"");
out.close();
Process chmod = Runtime.getRuntime().exec("chmod oga+rwx " + tmpFile.getCanonicalPath());
Process p = Runtime.getRuntime().exec(tmpFile.getCanonicalPath() + " " + path);

was sowas angeht, finde ich Java wirklich etwas umständlich, wobei die Sprache mir insgesamt gut gefällt 🙂
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben