为什么我能够直接从bash执行JAR?

问题描述:

我是一个长期的Java的家伙,知道运行与在罐中的MANIFEST.MF文件中引用主类的JAR的方式很简单:为什么我能够直接从bash执行JAR?

java -jar theJar.jar

我用这个启动Fabric3服务器(包含在标准发行版中的bin/server.jar)。我注意到,当我从分发tarball解压缩它时,它被标记为可执行文件。一时兴起,我想

./server.jar

从我bash命令行(bash 4.1.5版本在Ubuntu 10.10),你瞧,服务器启动时,如果我输入了正常java -jar ...命令。 JAR的结构像一个普通的JAR;我在它上面做了一个head,并且前几个字节中没有#!命令,所以bash不应该神奇地知道用它启动Java VM,对吧?或者这个bash版本增加了以正确的清单启动JAR的能力?查询头脑想知道...

这可能不是bash的一个特性。如果您运行的是Linux(如您已标记的),你可能有binfmt_misc内核模块,这确实神奇一点点,当您尝试执行程序。基本上,这是什么做的是它扩展了二进制格式的Linux可以从刚刚精灵执行也包括一些用户定义的格式,只要有足够的指令来运行它们。

+5

是的,就是这样。您可以在Ubuntu 10.10上运行update-binfmts --display查看安装了处理程序的列表。 – kkress 2010-11-11 23:01:45

+0

粗糙,显然我可以execure从命令行^^ LLVM字节码。 – SingleNegationElimination 2010-11-11 23:09:05

+0

好的,太棒了!感谢科学。 – aarestad 2010-11-12 23:09:22

这不是它已经长得这么怪能力的bash - 这是你的核心,特别是模块binfmt_misc。 (也有一些documentation specific to Java