JAR藏在EXE里面?

时间:2010-09-20 18:57:44

标签: java jar executable-jar

Java游戏

Minecraft本周末免费。 Windows版本作为exe文件下载。我很好奇EXE文件正在做什么以及它从哪里解压缩并运行实际的游戏JAR。所以使用命令,我找到了运行javaw.exe进程的命令行参数;奇怪的是,它是用一个指向可执行文件的类路径启动的! (意思是,.exe文件充当jar)。实际上,在将Minecraft.exe重命名为Minecraft.jar之后,我能够打开它并查看加载器类文件等,就像它是一个普通的JAR文件而不是EXE一样。

这怎么可能?我怎么能用我自己的JAR文件呢?

5 个答案:

答案 0 :(得分:11)

以前使用这种方法非常普遍 - 特别是在软盘空间宝贵的时代,解压缩程序与zip文件位于不同的磁盘上是很繁琐的。

之所以可以这样做是因为zip文件库存结构位于zip文件的 end ,而不是前面,所以zip文件可以包含大量的只要库存结构没有指向它们(并且通过扩展名jar文件),初始不相关的字节。一个非常频繁的用途是附上一个小的解压缩程序,然后解压缩zip文件。

这个程序前置的一个实用程序是unzipsfx。这是一个手册页: http://linuxcommand.org/man_pages/unzipsfx1.html

似乎Minecraft使用另一个自行调用Java的前置程序。


编辑:用十六进制编辑器查看内部。 Minecraft.exe包含在Launch4j中。

答案 1 :(得分:3)

  将Minecraft.exe重命名为Minecraft.jar后,我能够打开它并查看加载器类文件等

某些EXE文件实际上是自解压ZIP文件。 JAR文件依次是具有特殊文件结构的普通ZIP文件。我敢打赌,你只是在重命名后使用ZIP工具打开它。请注意,某些ZIP工具将在Windows资源管理器中自动集成(或者反过来),以便它看起来透明。

答案 2 :(得分:2)

ZIP(以及扩展名,JAR)文件格式非常灵活,因为它允许将存档嵌入到另一种文件格式中。这使得自解压ZIP压缩文件成为可能(一些小代码嵌入在ZIP文件参数确保被解压缩实用程序忽略的区域中)。它也被用于一些特别偷偷摸摸的漏洞利用。

我的猜测是,Minecraft同样利用了使存档成为有效Windows可执行文件的能力,并添加了代码以在类路径中启动JVM。

另请参阅:Wikipedia: Combining ZIP with other file formats

答案 3 :(得分:2)

Launch4J就是这么做的。这真是令人印象深刻。

答案 4 :(得分:1)

如果你想要一个快速的解决方案,而不需要花太多钱并使用包装器,Jsmooth可以很好地完成它。