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.
- 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)
- 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)
- 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.