Java-Shell-Skript ausführen, das in JAR gebündelt ist [duplizieren]

9

Ich habe ein Shell-Skript in meine JAR-Datei im 'engine' Paket gepackt.

In meinem Programm verwende ich einen Shell-Befehl mit Process und ProcessBuilder. Das alles funktioniert gut.

Wenn ich den Pfad zum Shell-Skript auf meinem Computer festlege, funktioniert das Programm einwandfrei. Wenn ich jedoch das Shell-Skript in meine JAR-Datei packe und so darauf zugreife:

%Vor%

Und führen Sie das Programm, dann bekomme ich den folgenden Fehler:

%Vor%

Ich fange an zu denken, dass das nicht möglich ist, ich würde dieses Shell-Skript gerne als Teil der Anwendung bereitstellen, kann es gemacht werden?

Vielen Dank im Voraus alle.

======== UPDATE ==========

Ich habe dieses Problem schließlich gelöst. Shell kann keine Skripte in einem JAR-Bundle ausführen, es geht nicht um Java, sondern um Shell. Ich habe das folgendermaßen behoben:

Java verfügt über eine createTempFile () -Methode (mit der Option, die Datei zu löschen, sobald die Anwendung beendet wurde), ruft diese auf und schreibt die Datei in das JAR-Paket, das auf diese temporäre Datei zugreifen soll. Sie haben dann das Shell-Skript im lokalen Dateisystem und können das Skript ausführen.

    
Cristian 13.10.2012, 17:21
quelle

3 Antworten

4

Es geht nicht um Java, es geht um Shell. Soweit ich weiß, kann der Shell-Interpreter keine Skripte ausführen, die sich in der Zip-Datei befinden. Sie haben also ein paar Optionen hier:

  1. Lesen Sie das Shell-Skript als Textdatei aus Ihrem Java-Programm. Erstelle eine temporale Datei (in temp dir oder an einem anderen relevanten Ort und kopiere den Inhalt der Datei dort. Und dann rufe den Shell-Interpreter mit diesem temporalen Skript auf. Ich glaube, es ist der beste Ansatz

  2. Da jar eine zip-Datei ist, können Sie sie aus der Shell extrahieren, ein Skript finden und die Shell ausführen. Auch das ist etwas peinlicher und eher falsch, aber technisch sollte es funktionieren.

  3. Wenn Sie in Ihrem Skript keine Low-Level-Sachen haben, können Sie erwägen, die Logik in ein grooviges Skript umzuschreiben (vielleicht finden Sie ein nützliches groosh-Projekt). Dann rufe den groovigen Code aus dem Speicher und nicht aus der Datei.

Nun, ich habe keine Ideen mehr, wenn ich du wäre, würde ich die erste Lösung implementieren :) Viel Glück und hoffe das hilft

    
Mark Bramnik 13.10.2012, 17:39
quelle
4

Die einfachste Lösung wäre, wenn Ihre Anwendung das Shell-Skript in einen temporären Speicherort extrahiert und von dort ausführt.

Sie können eine temporäre Datei in Java erstellen, indem Sie File.createTempFile(String, String) aufrufen.

Eine andere Sache, die Sie möglicherweise tun können, ist, den Inhalt des Skripts, wie von Ihrem jar geladen, als Standard-Eingabe der Shell zu übergeben.

Zur Vereinfachung: Wenn ich ein Archiv a.zip mit einem Skript a.sh hätte, würde dies Folgendes ausführen:

%Vor%

Von einem Java-Programm können Sie Folgendes tun:

%Vor%     
Vlad 13.10.2012 17:29
quelle
0

Normalerweise mache ich nur ...

%Vor%

... welches Sie bei Bedarf von einer Runtime.exec () aufrufen können.

    
rich 13.10.2012 18:43
quelle

Tags und Links