Ändern einer Datei in einem Glas


85

Ich möchte eine Datei in meinem Glas ändern. Ist es möglich, dies aus meiner Anwendung heraus zu extrahieren und erneut zu erschüttern?

Datei, die ich ändern möchte, sind Konfigurationsdateien, meistens XML-basiert.

Der Grund, warum ich daran interessiert bin, nicht zu stören, ist, dass die Anwendung mit launch4j verpackt ist. Wenn ich sie entpacke, kann ich die EXE-Datei nicht erneut erstellen.


1
Ich möchte die zusätzlichen Dateien in der Anwendung behalten, ohne temporäre Dateien im Dateisystem zu erstellen.
Hamza Yerlikaya

Versuchen Sie diese Lösung stackoverflow.com/a/4837522/1853864 Ich habe verwendet und meine Probleme wurden gelöst.
A. Magalhães

Könnten Sie bitte die aktuell akzeptierte Antwort nicht akzeptieren? Es hat eine negative Punktzahl und ist absolut nicht hilfreich
Dici

Antworten:


82

Sie können die uOption für verwendenjar

Aus den Java-Tutorials:

jar uf jar-file input-file(s)

"Alle Dateien, die sich bereits im Archiv befinden und denselben Pfadnamen wie eine hinzugefügte Datei haben, werden überschrieben."

Siehe Aktualisieren einer JAR-Datei .

Viel besser als das ganze Glas noch einmal zu machen. Das Aufrufen aus Ihrem Programm heraus klingt ebenfalls möglich. Versuchen Sie, die Befehlszeile in Java auszuführen


Genial! Aber sie fügten die Pfadnamen lustig hinzu. IE Bitbucket.foo.bar anstelle der com.etc.etc die vorhandene hat
StarWind0

26

Sie können Vim verwenden:

vim my.jar

Vim kann komprimierte Textdateien bearbeiten, sofern Sie diese unzipin Ihrer Umgebung haben.


3
Das ist toll. Navigieren Sie zu der gesuchten Datei und drücken Sie die Eingabetaste. Bearbeiten Sie die Datei und geben Sie Folgendes ein: wq zum Speichern!
Michael Butler

Außerdem müssen Sie zipin Ihrer Umgebung die Änderungen speichern können. Danke für die Antwort!
Troig

10

Java-JAR-Dateien haben dasselbe Format wie Zip-Dateien. Wenn Sie also ein Zip-Datei-Dienstprogramm haben, mit dem Sie ein Archiv ändern können, haben Sie Ihren Fuß in der Tür. Das zweite Problem ist, wenn Sie eine Klasse oder etwas neu kompilieren möchten, müssen Sie wahrscheinlich nur das Glas neu erstellen. Eine Textdatei oder etwas anderes (z. B. XML) sollte jedoch leicht genug geändert werden können.


8

Wie viele gesagt haben, können Sie eine Datei in einer JAR nicht ändern, ohne die JAR erneut zu scannen. Mit Launch4J ist es noch schlimmer. Sie müssen die EXE neu erstellen, sobald Sie die JAR ändern. Gehen Sie also nicht diesen Weg.

Es ist im Allgemeinen eine schlechte Idee, Konfigurationsdateien in die JAR zu legen. Hier ist mein Vorschlag. Suchen Sie an einigen festgelegten Speicherorten nach Ihrer Konfigurationsdatei (z. B. Ausgangsverzeichnis, \ Programme \ usw.). Wenn Sie eine Konfigurationsdatei finden, verwenden Sie diese. Verwenden Sie andernfalls die in der JAR als Fallback. In diesem Fall müssen Sie nur die Konfigurationsdatei an den festgelegten Speicherort schreiben, und das Programm nimmt sie auf.

Ein weiterer Vorteil dieses Ansatzes besteht darin, dass die geänderte Konfigurationsdatei nicht überschrieben wird, wenn Sie Ihre Software aktualisieren.



2

Dies mag mehr Arbeit sein, als Sie kurzfristig erledigen möchten, aber ich vermute, dass es auf lange Sicht sehr vorteilhaft für Sie wäre, Ant (oder Maven oder sogar Bazel ) zu verwenden, anstatt die Gläser manuell zu bauen . Auf diese Weise können Sie einfach auf die Ant-Datei klicken (wenn Sie Eclipse verwenden) und das JAR neu erstellen.

Alternativ möchten Sie diese Konfigurationsdateien möglicherweise überhaupt nicht im JAR haben. Wenn Sie damit rechnen, diese Dateien regelmäßig ersetzen zu müssen, oder wenn sie an mehrere Parteien verteilt werden sollen, sollte die Konfigurationsdatei nicht Teil dieser Datei sein das Glas überhaupt.


2
Einverstanden. Möglicherweise möchten Sie jedoch eine "Standard" -Konfigurationsdatei in die JAR einfügen. Wenn also etwas mit der externen passiert (beschädigt, gelöscht usw.), können Sie auf eine Standardkonfiguration zurückgreifen.
Thomas Owens

Richtig - obwohl ich nicht weiß, wie viele Anwendungen ohne ihre Konfigurationsdateien weiterhin funktionieren würden ...
dimo414

1

Der Grund dafür ist, dass die JAR-Datei wie eine Zip-Datei eingerichtet ist. Wenn Sie die Datei ändern möchten, müssen Sie alle Einträge auslesen, den zu ändernden ändern und die Einträge dann zurück in die JAR-Datei schreiben. Ich musste das schon einmal machen, und das war der einzige Weg, den ich finden konnte, um es zu tun.

BEARBEITEN

Beachten Sie, dass hierfür die internen Java-JAR-Dateibearbeitungsprogramme verwendet werden, bei denen es sich um Dateistreams handelt. Ich bin mir sicher, dass es eine Möglichkeit gibt, das gesamte Glas in den Speicher einzulesen, alles zu ändern und dann wieder in einen Dateistream zu schreiben. Ich glaube, dass Dienstprogramme wie 7-Zip und andere dies tun, da ich glaube, dass die ToC eines Zip-Headers zum Zeitpunkt des Schreibens definiert werden muss. Ich könnte mich jedoch irren.


1

Ja, mit SQLite können Sie aus der JAR-Datei aus einer Datenbank lesen oder in eine Datenbank schreiben, damit Sie sie nicht extrahieren und dann erneut jargen müssen. Folgen Sie meinem Beitrag http://shoaibinamdar.in/blog/? p = 313

Mit der Syntax "jdbc: sqlite :: resource:" können Sie aus der JAR-Datei heraus in eine Datenbank lesen und schreiben


1
Hallo, willkommen bei stackoverflow. Ich habe die Abkürzungen aus Ihrem Beitrag entfernt. Im Allgemeinen ist eine Kurzform im Textnachrichtenstil hier nicht geeignet. Ich denke, diese Antwort wäre eine gute Antwort auf die Frage, wenn Sie weitere Details aus Ihrem Blog in die Antwort selbst aufnehmen würden, damit jemand, der Ihre Antwort liest, etwas lernt, auch wenn er das Blog nicht liest oder es verschoben wird zu einem späteren Zeitpunkt zu einer anderen URL.
Flexo

1

Schauen Sie sich TrueZip an .

Über eine virtuelle Dateisystem-API wird genau das getan, was Sie möchten (um Dateien in einer JAR-Datei inline zu bearbeiten). Es unterstützt auch verschachtelte Archive (Glas in Glas).


1

JAR-Datei zum Beispiel extrahieren. mit winrar und benutze CAVAJ:

Cavaj Java Decompiler ist ein grafisches Freeware-Dienstprogramm, das Java-Quellcode aus CLASS-Dateien rekonstruiert.

Hier ist ein Video-Tutorial, wenn Sie Folgendes benötigen: https://www.youtube.com/watch?v=ByLUeem7680


Nun, die Software "CAVAJ verwenden" ist hier die Antwort. Der Link ist nur eine Ergänzung, wenn zusätzliche Erklärungen erforderlich sind.
Tomasz Mularczyk

0

Solange diese Datei nicht .class ist, dh Ressourcendatei oder Manifestdatei, können Sie.


und wie, ohne zu extrahieren und neu zu jarren?
user85421

0

Der einfachste Weg, dies in Windows zu tun, ist mit WinRAR :

  1. Klicken Sie mit der rechten Maustaste auf die Datei und wählen Sie "Mit WinRAR öffnen" aus dem Kontextmenü.
  2. Navigieren Sie zu der zu bearbeitenden Datei und doppelklicken Sie darauf, um sie im Standardeditor zu öffnen.
  3. Speichern und beenden Sie den Editor, nachdem Sie die Änderungen vorgenommen haben.
  4. Daraufhin wird ein Dialogfeld angezeigt, in dem Sie gefragt werden, ob Sie die Datei im Archiv aktualisieren möchten. Wählen Sie "Ja", und die JAR wird aktualisiert.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.