8 Stimmen

Ausführende Jar-Datei modifizieren

Hallo Stack Overflow Freunde. Ich habe ein einfaches Problem, das, wie ich befürchte, keine einfache Lösung hat, und ich brauche Rat, wie ich vorgehen soll. Ich entwickle eine Java-Anwendung, die als ausführbare JAR-Datei verpackt ist, aber es erfordert, einige der JAR-Datei-Inhalte während der Ausführung zu ändern. In dieser Phase stoße ich auf ein Problem, weil einige Betriebssysteme die Datei sperren und damit das Schreiben verhindern.

Es ist wichtig, dass der Benutzer eine aktualisierte Version der JAR-Datei sieht, wenn die Anwendung beendet wird, obwohl ich ziemlich flexibel sein kann, wie dies zu erreichen. Eine saubere und effiziente Lösung ist natürlich zu bevorzugen, aber die Portabilität ist die einzige harte Anforderung.

Nachfolgend drei Lösungsansätze, die ich sehe. Sie können diese gerne kommentieren oder andere vorschlagen.

  1. Sagen Sie Java, dass es die JAR-Datei zum Schreiben freischalten soll (dies scheint nicht möglich zu sein, wäre aber die einfachste Lösung)
  2. Kopieren Sie die ausführbaren Klassendateien beim Anwendungsstart in eine temporäre Datei, verwenden Sie einen Classloader, um diese Dateien zu laden, und entladen Sie die Dateien aus der ursprünglichen JAR-Datei. (Ich habe nicht viel Erfahrung mit Classloadern, aber hoffentlich ist die JVM dann schlau genug, um zu erkennen, dass die ursprüngliche JAR-Datei nicht mehr verwendet wird, und gibt sie frei)
  3. Legen Sie eine zweite ausführbare JAR-Datei innerhalb der ersten, beim Start entpacken Sie die innere JAR-Datei in eine temporäre Datei, rufen Sie einen neuen Java-Prozess mit der kopierten inneren JAR-Datei auf und übergeben Sie ihm den Speicherort der äußeren JAR-Datei, der erste Prozess wird beendet, der zweite Prozess modifiziert die äußere JAR-Datei ohne Nummerierung (dies wird funktionieren, aber ich bin mir nicht sicher, ob es einen plattformunabhängigen Weg gibt, wie eine Java-Anwendung eine andere aufruft).

Ich weiß, dass dies eine seltsame Frage ist, aber ich würde jede Hilfe zu schätzen wissen.

3voto

Kris Punkte 14218

Eine Möglichkeit:

Lassen Sie das Programm eine modifizierte kopieren. der JAR-Datei.

Fügen Sie in die JAR-Datei eine zweite JAR-Datei mit einem Dienstprogramm ein, das bei der Ausführung die ursprüngliche JAR-Datei löscht und die geänderte Kopie so umbenennt, dass sie dem Original entspricht.

Wenn Ihr Programm beendet ist (und Änderungen vorgenommen wurden), extrahieren Sie dieses Dienstprogramm und starten es in seiner eigenen JVM (mit Runtime.getRuntime().exec() ). Das Dienstprogramm würde warten, bis die Sperre für die ursprüngliche, nicht geänderte JAR aufgehoben wird, und dann sein Geschäft erledigen und sich beenden.

Für den Benutzer sieht es so aus, als ob die JAR-Datei beim Beenden aktualisiert wird (oder zumindest nahe dran ist!).

1voto

MJB Punkte 9166

Ich glaube ehrlich gesagt, dass Ihr Ansatz falsch ist. Er passt einfach nicht zu der standardmäßigen Art und Weise der Bereitstellung von Java. Ihre geänderten Dateien müssen einfach irgendwo in einer DB- oder Xml-Datei persistieren - das ist der einzig sinnvolle Ansatz.

Alles ist nur ein "Kampf gegen den Wind" - man kann es mit etwas Mühe zum Funktionieren bringen, aber irgendwann wird es einen oder den Kunden beißen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X