【问题标题】:How do I directly execute a jar in linux?如何在linux中直接执行jar?
【发布时间】:2012-06-18 17:14:56
【问题描述】:

我只想能够做到./whatever.jar 而不是java -jar whatever.jar

我找到了办法:

#!/bin/bash
java -jar $0 $*
exit
# jar goes here...

但它不起作用。 Java 只是抱怨它是一个无效/损坏的 jarfile。

我也试过管道:

#!/bin/bash
tail -n +4 $0 | java -jar
exit
# jar goes here...

但这不起作用。

一种方法是以某种方式将文件拆分为两个单独的部分(脚本部分和 jar 部分),然后执行 jar,但这是多余的。您不妨制作一个执行 jar 并执行该脚本的脚本。

所以我需要弄清楚如何以某种方式tail 并伪造文件。

我认为我可以使用/dev/stdout

#!/bin/bash
java -jar /dev/stdout
tail -n +5 $0
exit
# jar goes here...

这也不起作用。它只是打印 jar 的内容,java 抱怨它是无效的。 (后来发现/dev/stdout里面没什么可看的)

所以我需要以其他方式阅读stdout。我真的希望我能管它。这会让事情变得容易得多:)

【问题讨论】:

  • 我不认为这是一件可行的事情,除了“制作一些其他运行 java -jar myjar.jar 本身的脚本。
  • 您是如何在第一个版本中创建脚本的?您是否包含有效的清单文件?请提供您使用的命令。
  • 你可能不得不考虑像launch4j.sourceforge.net这样的工具。

标签: java linux bash jar executable-jar


【解决方案1】:

您需要一个名为jexec 的服务,一些Linux 发行版附带此安装检查/etc/init.d/jexec。我的 CentOS 5.5 肯定可以。

它的作用是将 jexec 解释器注册到 binfmt 系统。

有关更多信息,您可能需要快速阅读binfmt_misc

【讨论】:

  • 我没有jexec(Kubuntu 12.04,OpenJDK 6)
【解决方案2】:

假设您已安装内核源代码,请查看 /usr/src/linux/Documentation/java.txt 以了解使用内核的 BINFMT_MISC 支持直接运行 Java 代码的方法(假设它已编译到您的内核版本中) '正在运行,但我认为它在大多数主要发行版上)。如果你没有安装源,你应该可以很容易地在网上找到它(这里是one 示例)。

【讨论】:

【解决方案3】:

仅供参考,如果您想按照原来的方式进行操作,可以这样:

$ cat jar.sh
#!/usr/bin/env bash
java -jar <(tail -n +4 "$0")
exit

$ cat jar.sh runme.jar > works.jar

$ chmod a+x works.jar

$ ./works.jar

假设最近的bash 支持&lt;()

【讨论】:

  • @bi99l35:当然可以。如果您有问题,请发布您遇到的错误。
  • Invalid or corrupt jarfile /dev/fd/63 - 这是有道理的,因为块设备不是常规文件。
【解决方案4】:

java -jar 不适用于标准输入,显然它会进行一些搜索而不是直接读取。 在无法修改的系统上,您必须使用 tmp。例如。

#!/bin/bash
JF=/tmp/junk$$.jar
(uudecode -o /dev/stdout >$JF;java -jar $JF;unlink $JF) <<JAR
begin-base64 644 junk.jar
UEsDBBQACAAIAEaBz0AAAAAAAAAAAAAAAAAJAAQATUVUQS1JTkYv/soAAAMA
UEsHCAAAAAACAAAAAAAAAFBLAwQUAAgACABGgc9AAAAAAAAAAAAAAAAAFAAA
AE1FVEEtSU5GL01BTklGRVNULk1G803My0xLLS7RDUstKs7Mz7NSMNQz4OVy
LkpNLElN0XWqBAmY6RnEG5koaASX5in4ZiYX5RdXFpek5hYreOYl62nycvkm
ZubpOuckFhdbKWSV5mXzcvFyAQBQSwcIBHn3CVkAAABZAAAAUEsDBBQACAAI
AEd+z0AAAAAAAAAAAAAAAAAKAAAAanVuay5jbGFzc21QTUvDQBB926RJE6Ot
ramfhXoQogcDXiteBPFQVIjowdOmXcrGZCMxEfxZelDw4A/wR4mzUShCF3Zn
9s2bt2/26/vjE8ARBi4stB10sNpC10UPazZ8G30G61gqWZ4wGMH+DYN5mk8F
Q3sslbioslgU1zxOCTEzLhVDP7gbJ/yJhylXszAqC6lmI93oRnlVTMSZ1GQn
qdT9oeZ5sNGyse5hA5sM3rlI03x4mxfpdNfGlodt7JC45jN05sqXcSIm5T8o
en4sRUZG84oK/q8NmYdX5KEkJ4JnI4beApjBftC3lAbwg0X+MUSTvkivBm3y
DJqCsgFFRrF58A72QglNSqdVg5qyBO+PuketGnVe0egabzDndLdWNUjVJGS5
fmXlB1BLBwjDUWL/IAEAAJ4BAABQSwECFAAUAAgACABGgc9AAAAAAAIAAAAA
AAAACQAEAAAAAAAAAAAAAAAAAAAATUVUQS1JTkYv/soAAFBLAQIUABQACAAI
AEaBz0AEefcJWQAAAFkAAAAUAAAAAAAAAAAAAAAAAD0AAABNRVRBLUlORi9N
QU5JRkVTVC5NRlBLAQIUABQACAAIAEd+z0DDUWL/IAEAAJ4BAAAKAAAAAAAA
AAAAAAAAANgAAABqdW5rLmNsYXNzUEsFBgAAAAADAAMAtQAAADACAAAAAA==
====
JAR

【讨论】:

    【解决方案5】:

    编写一个单独的shell脚本:

    whatever.sh

    #!/bin/bash
    java -jar whatever.jar $*
    

    您不能使 JAR 文件直接可执行,因为它不是可执行文件。它是 Java 字节码,机器无法直接读取,我所知道的任何标准 shell 解释器都无法读取。

    【讨论】:

    • 这并不是我真正想要的。我只想能够做到./whatever.jar
    • 问题是,Java 字节码不是可执行的,也不是脚本。当您使用./ 执行某些操作时,shell 需要这两者之一。
    【解决方案6】:

    或者我可以只安装 jarwrapper (Ubuntu) 软件包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-05
      • 2016-11-05
      • 2016-04-15
      • 2011-08-18
      • 2011-10-07
      • 1970-01-01
      • 2015-11-20
      • 2011-06-10
      相关资源
      最近更新 更多