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