2

我只想能够做到./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其他方式阅读。我真的希望我能管它。它会让事情变得容易得多:)

4

6 回答 6

4

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

它所做的是将 jexec 解释器注册到 binfmt 系统。

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

于 2012-06-15T15:55:01.813 回答
2

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

于 2012-06-15T15:55:48.653 回答
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支持<()

于 2012-06-15T16:35:21.847 回答
1

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
于 2012-06-15T20:35:16.303 回答
0

编写一个单独的shell脚本:

随便什么.sh

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

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

于 2012-06-15T15:44:28.477 回答
0

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

于 2012-07-28T20:53:31.130 回答