Ändern der ausführenden Jar-Datei

8

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.

  1. Sagen Sie Java, um die JAR-Datei zum Schreiben freizugeben (dies scheint nicht möglich, aber es wäre die einfachste Lösung)
  2. Kopieren Sie die ausführbaren Klassendateien beim Start der Anwendung in eine temporäre Datei, verwenden Sie einen Klassenlader, um diese Dateien zu laden und die Dateien aus der ursprünglichen JAR-Datei zu entfernen (nicht viel Erfahrung mit den Klassenlatern, aber hoffentlich wäre die JVM dann schlau) genug um zu erkennen, dass das Original JAR nicht mehr benutzt wird und es entsperrt)
  3. Legen Sie eine zweite ausführbare JAR-Datei in die erste, beim Start extrahieren Sie die innere jar zu e temporären Datei, rufen Sie einen neuen Java-Prozess mit der kopierten inneren JAR und übergeben Sie den Speicherort der äußeren JAR, erste Prozess-Exits, zweite Prozessmodify Das äußere Jar wird nicht berechnet. (Dies funktioniert, aber ich bin nicht sicher, ob es eine plattformunabhängige Art von Java-App gibt, die ein anderes aufruft)

Ich weiß, das ist eine seltsame Frage, aber jede Hilfe wäre willkommen.

    
PinkyNoBrain 17.03.2010, 15:58
quelle

2 Antworten

2

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

    
Kris 17.03.2010, 16:23
quelle
1

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.

    
MJB 18.03.2010 07:05
quelle