Hallo Stack Overflow Freunde. Ich habe ein einfaches Problem, von dem ich befürchte, dass es keine einfache Lösung gibt, und ich brauche einen Rat, wie es weitergeht. Ich entwickle eine Java-Anwendung, die als und ausführbare JAR-Datei gepackt wird, aber es erfordert, einige ihrer JAR-Dateiinhalte während der Ausführung zu ändern. Zu diesem Zeitpunkt habe ich ein Problem festgestellt, weil einige Betriebssysteme die Datei sperren, um Schreibvorgänge zu verhindern.
Es ist wichtig, dass der Benutzer eine aktualisierte Version der JAR-Datei zu dem Zeitpunkt sieht, zu dem die Anwendung beendet wird, obwohl ich ziemlich flexibel sein kann, wie dies zu erreichen ist. Eine saubere und effiziente Lösung ist offensichtlich vorzuziehen, aber Portabilität ist die einzige harte Anforderung.
Das Folgende sind drei Ansätze, die ich sehen kann, um das Problem zu lösen, fühlen Sie sich frei, sie zu kommentieren oder andere zu empfehlen.
Ich weiß, das ist eine seltsame Frage, aber jede Hilfe wäre willkommen.
Eine Option:
Lassen Sie das Programm eine modifizierte Kopie der JAR-Datei schreiben.
Fügen Sie in die JAR-Datei ein zweites JAR mit einem Dienstprogramm ein, das bei seiner Ausführung die ursprüngliche JAR-Datei löscht und die geänderte Kopie umbenennt, damit sie mit der des Originals übereinstimmt.
Wenn Ihr Programm beendet wird (und Änderungen vorgenommen wurden), extrahieren Sie dieses Dienstprogramm und starten Sie es in seiner eigenen JVM (mit Runtime.getRuntime().exec()
). Das Dienstprogramm wartet darauf, dass die Sperre von der ursprünglichen, nicht geänderten JAR-Datei getrennt wird, und führt dann ihre Aufgabe aus und beendet sie.
Für den Benutzer scheint die JAR-Datei beim Beenden aktualisiert zu werden (oder nahe genug!).
Ich glaube wirklich, dass Ihre Herangehensweise falsch ist. Dies passt einfach nicht zur standardmäßigen Bereitstellung von Java. Ihre geänderten Dateien müssen nur irgendwo in einer db oder xml Datei bleiben - das ist der EINZIGE sinnvolle Ansatz.
Alles ist nur "gegen den Wind kämpfen" - Sie könnten mit einigen kämpfen es zur Arbeit bringen, aber es wird Sie oder Kunden schließlich beißen.
Tags und Links java file-io jar classloader executable-jar