2010-09-20 13 views
11

Minecraft, ein Java-Spiel, ist dieses Wochenende kostenlos. Die Windows-Version wird als EXE-Datei heruntergeladen. Ich war neugierig, was die EXE-Datei macht und wo sie das eigentliche Spiel JAR entpackt und ausführt. Mit einem Befehl habe ich die Befehlszeilenargumente für den laufenden javaw.exe-Prozess gefunden. und seltsamerweise wurde es mit einem Klassenpfad gestartet, der auf die ausführbare Datei zeigte! (Das bedeutet, dass die .exe-Datei wie ein Jar agierte). Nach dem Umbenennen von Minecraft.exe zu Minecraft.jar konnte ich es öffnen und die Loader-Klassendateien und ähnliches sehen, als wäre es eine normale JAR-Datei und keine EXE.JAR versteckt in EXE?

Wie ist das möglich? Und wie kann ich das mit meinen eigenen JAR-Dateien machen?

+0

und Doppelklick auf die EXE-Datei startet das Spiel? Das sind verrückte Sachen! – jrharshath

+0

Könnte dies damit zusammenhängen, wie selbstextrahierende Archive funktionieren (WinZip)?Schließlich ist Jar eigentlich ein Zip-Archiv, oder? Sie können dem Klassenpfad auch eine Zip-Datei hinzufügen. Sind Sie sicher, dass es sich nicht um eine Datei handelt? –

+0

Ich glaube nicht. das Umbenennen eines selbstextrahierenden Archivs wird es nicht magisch einer JAR-Dateistruktur geben ... – jrharshath

Antwort

11

Dies war früher sehr üblich - besonders in den Tagen der Disketten, wo Platz war kostbar und es war mühsam für das Unzip-Programm auf einer anderen Festplatte als die Zip-Datei.

Der Grund, warum es getan werden kann, weil die Zip-Datei Inventarstruktur am Ende befindet der Zip-Datei, nicht die Front, so eine Zip-Datei als eine große Anzahl von anfänglichem irrelevant Bytes enthält solange die Inventarstruktur nicht auf sie zeigt (und auch auf JAR-Dateien). Eine sehr häufige Verwendung dafür war es, ein kleines unzip-only-Programm einzuschließen, das dann die zip-Datei entpacken konnte.

Ein Dienstprogramm, um solch ein Programm voranzustellen, ist das unzipsfx. Hier ist eine Handbuchseite dafür: http://linuxcommand.org/man_pages/unzipsfx1.html

Es scheint, dass Minecraft ein anderes vorangestelltes Programm verwendet, das Java auf sich selbst aufruft.


BEARBEITEN: Sah mit einem Hex-Editor nach innen. Minecraft.exe ist mit Launch4j verpackt.

+1

Danke, dass Sie herausgefunden haben, dass Launch4j der Wrapper ist! Sehr interessant. – Ricket

+0

Ich habe launch4j jetzt für eine Weile als Ersatz für JSMooth in einem Projekt verwendet. Bisher keine Fehlerberichte. –

1

Wenn Sie eine schnelle Lösung wünschen, ohne zu viel zu tun und einen Wrapper zu verwenden, macht Jsmooth seine Arbeit gut.

+0

wird jsmoooth eine exe, die als JAR umbenannt werden kann, * und behandelt wie ein Glas *? – jrharshath

+0

Die JSmooth Wrapper erstellt keine gültigen JAR-Dateien. –

3

nach Minecraft.exe zu Minecraft.jar Umbenennung, ich war in der Lage, sie zu öffnen und die Loader-Klasse-Dateien und so

Einige EXE-Dateien sind in der Tat selbstextrahierende ZIP-Dateien zu sehen. JAR-Dateien sind wiederum normale ZIP-Dateien mit einer speziellen Dateistruktur. Ich wette, dass Sie es nur mit einem ZIP-Tool geöffnet haben, nachdem Sie es umbenannt haben. Beachten Sie, dass sich einige ZIP-Tools automatisch im Windows-Explorer integrieren (oder andersherum), so dass dies scheinbar transparent geschieht.

+0

Auf den zweiten Gedanken sind die Antworten nicht genau die gleichen, so fügte ich selbst eine Antwort hinzu. Ich glaube nicht, dass das OP eine selbstextrahierende ZIP-Datei betrachtet hat; Sie verwenden nur denselben Mechanismus, um ausführbaren Code in das Zip-Archiv zu schreiben. –

2

Das Dateiformat ZIP (und nach Erweiterung, JAR) ist insofern flexibel, als das Archiv in ein anderes Dateiformat eingebettet werden kann. Dies macht selbstextrahierende ZIP-Archive möglich (einige kleine Codes sind in Bereichen eingebettet, die von den ZIP-Dateiparametern nicht berücksichtigt werden). Es wurde auch für einige besonders hinterhältige Heldentaten verwendet.

Meine Vermutung ist, dass Minecraft in ähnlicher Weise die Fähigkeit ausgenutzt hat, das Archiv zu einer gültigen Windows-ausführbaren Datei zu machen und Code hinzuzufügen, um die JVM mit sich selbst im Klassenpfad zu starten.

Siehe auch: Wikipedia: Combining ZIP with other file formats

+0

Haha, dein Name ist auf den ersten Blick so ähnlich wie Markus Persson (Schöpfer von Minecraft), dass ich für einen Moment dachte, das sei eine "offizielle" Antwort auf die Frage von ihm. – Ricket

2

launch4j dies tut. Es ist wirklich beeindruckend.

+0

open source aber zusätzlich "Launch4j kann für die Umhüllung geschlossener Quelle, kommerzielle Anwendungen verwendet werden." –

+1

Ich spähte hinein. Minecraft ist mit Launch4j verpackt. –