【问题标题】:Why am I able to execute JARs directly from bash?为什么我可以直接从 bash 执行 JAR?
【发布时间】:2011-05-08 18:50:42
【问题描述】:

我是一名长期的 Java 人,并且知道在 Jar 内的 MANIFEST.MF 文件中引用主类来运行 JAR 的方法很简单:

java -jar theJar.jar

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

./server.jar

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

【问题讨论】:

    标签: java linux bash


    【解决方案1】:

    这可能根本不是 bash 的一个特性。如果您正在运行 linux(正如您已标记的那样),您可能拥有 binfmt_misc 内核模块,当您尝试执行程序时,它会产生一点魔力。基本上,它的作用是将 linux 可以执行的二进制格式从 elf 扩展到还包括一些用户定义的格式,并有足够的指令来运行它们。

    【讨论】:

    • 是的,就是这样。您可以在 Ubuntu 10.10 上运行 update-binfmts --display 以查看已安装处理程序的列表。
    • 粗糙,显然我可以从命令行执行 llvm 字节码^^。
    【解决方案2】:

    并不是 bash 产生了这种奇怪的能力——它是你的内核,特别是模块 binfmt_misc。 (还有一些documentation specific to Java

    【讨论】:

      猜你喜欢
      • 2015-08-22
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多