如何在linux中直接执行jar?

时间:2012-06-15 15:41:19

标签: java linux bash jar executable-jar

我只希望能够./whatever.jar代替java -jar whatever.jar

我找到了办法:

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

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

我也试过配管:

#!/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以其他方式阅读。我真的希望我可以管它。它会让事情变得更容易:)

6 个答案:

答案 0 :(得分:4)

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

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

有关详细信息,您可以快速阅读binfmt_misc

答案 1 :(得分:2)

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

答案 2 :(得分:1)

仅供参考,如果你想以原来的方式去做,那就是这样:

$ 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支持<()

答案 3 :(得分:1)

java -jar不能与stdin一起使用,显然它确实有些寻求而不是直读。 在你不能修改的系统上,你必须使用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

答案 4 :(得分:0)

编写单独的shell脚本:

whatever.sh

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

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

答案 5 :(得分:0)

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