2010-03-17 14 views
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 weitergehen soll. 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.Ändern Ausführen Jar Datei

Es ist wichtig, dass der Benutzer eine aktualisierte Version der JAR-Datei bis zum Beenden der Anwendung sieht, 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.

Die folgenden drei Ansätze, die ich sehen kann, um das Problem zu lösen, fühlen sich frei, sie zu kommentieren oder andere zu empfehlen.

  1. Java Sagen Sie die JAR-Datei für das Schreiben (dies scheint nicht möglich, aber es wäre die easyest Lösung)
  2. Kopieren Sie die ausführbaren Klassendateien auf eine tempory Datei auf Start der Anwendung zu entsperren, einen Class-Loader verwenden zu laden Diese Dateien und entlädt diejenigen aus der ursprünglichen JAR-Datei. (Nicht viel Erfahrung mit den Klassenlatern, aber hoffentlich wäre die JVM dann schlau genug, um zu erkennen, dass die ursprüngliche JAR nicht mehr in Benutzung ist und sie entsperrt)
  3. Setzen Sie eine Sekunde ausführbare JAR-Datei in der ersten, beim Start extrahieren Sie die innere jar zu e temporären Datei, rufen Sie einen neuen Java-Prozess mit dem kopierten inneren JAR und übergeben Sie den Speicherort der Outer JAR, ersten Prozess Ausfahrten, modifys zweiter Prozess der Outer jar unincumbered. (Dies funktioniert, aber ich ist eine Plattform unabhängige Weise von einer Java-Anwendung aufgerufen wird eine andere nicht sicher, es ist)

Ich weiß, dass dies eine seltsame Frage ist, würde aber jede Hilfe dankbar sein .

+3

Können Sie angeben, warum Sie die JAR-Datei während der Ausführung ändern müssen? – Poindexter

+0

@pinkynobrain du denkst die alte Schule ant Weg, ich schlage vor, Sie lesen Maven von Beispiel kostenlos Ebook, Sie werden sehen, dass was Sie vorschlagen, macht keinen Sinn .. Ich versuche nicht zu beleidigen Sie nur versuchen, Ihnen zu helfen .. sind wir nicht alle dort gewesen – ant

+0

Was versuchen Sie zu erreichen - eine sich selbst aktualisierende Anwendung? –

Antwort

2

Eine Option:

Haben das Programm eine Kopie der JAR-Datei geändert schreiben.

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

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 würde darauf warten, dass die Sperre von der ursprünglichen, nicht geänderten JAR-Datei abweicht, und dann ihre Aufgabe erledigen und beenden.

Für den Benutzer scheint die JAR-Datei beim Beenden zu aktualisieren (oder nahe genug!).

+0

Hey, thx für deine Antwort, das ist definitiv eine andere Lösung, obwohl es immer noch suffur aus dem gleichen Problem wie meine Option 3. Ich nehme an exec ("java") ist fair Ich habe gehofft, dass es eine wirklich plattformunabhängige Möglichkeit gibt, eine Java-App von einer anderen zu starten – PinkyNoBrain

+0

Java ist zwar viel plattformunabhängiger als viele andere Sprachen, aber es ist in vielerlei Hinsicht unvollkommen, und es ist nicht wirklich ein großer Deal etwas wie die Art, wie Sie eine JAR-Datei ausführen, in einem Switch auf der Grundlage der Plattform getan werden (wenn es sogar anders sein muss - ich denke 'Java ' arbeitet auf Unix und Windows, nicht sicher über OSX). – Chris

+0

Was ist los Sie erhalten alle Informationen, die Sie benötigen, um 'Runtime.getRuntime() .exec()' in einer "unabhängigen" Plattform vor dem eigentlichen Aufruf auszuführen. Ich denke, dass die 'System.getProperties()' Methode einige nützliche Informationen enthält aktion. –

1

Ich denke ehrlich, dass Ihre Herangehensweise falsch ist. Dies passt einfach nicht zur standardmäßigen Bereitstellung von Java. Ihre modifizierten 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, um es zu arbeiten, aber es wird Sie oder Kunden schließlich beißen.

+0

Es tut mir leid, dass Ihnen diese Antwort nicht gefällt. Was mit Umbenennen, Sperren usw. gemeint war, ich habe nur meine Meinung ausgedrückt, dass Sie versucht haben, eine Lösung zu erzwingen, die nicht gut zu dem Problem passt. – MJB

+1

Das wäre also ein Kommentar, keine Antwort –

Verwandte Themen