Java 如何在linux中直接执行jar?
我只想能够做Java 如何在linux中直接执行jar?,java,linux,bash,jar,executable-jar,Java,Linux,Bash,Jar,Executable Jar,我只想能够做/whatever.jar,而不是java-jarwhatever.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部分
/whatever.jar
,而不是java-jarwhatever.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并执行该脚本
因此,我需要找出如何以某种方式跟踪它并伪造文件
我想我可以使用/dev/stdout
:
#!/bin/bash
java -jar /dev/stdout
tail -n +5 $0
exit
# jar goes here...
那也不行。它只打印jar的内容,java抱怨它无效。(我后来发现在/dev/stdout
中没有什么可读的)
因此,我需要以其他方式阅读stdout
。我真希望我能用管子吹。这将使事情变得更加简单:)编写一个单独的shell脚本:
随便了,嘘
#!/bin/bash
java -jar whatever.jar $*
不能使JAR文件直接可执行,因为它不是可执行文件。它是Java字节码,不能被机器直接读取,也不能被我所知道的任何标准shell解释器读取。你需要一个名为jexec
的服务,一些linux发行版附带了这个安装的check for/etc/init.d/jexec
。我的CentOS 5.5绝对可以
它所做的是向binfmt系统注册jexec解释器
要了解更多信息,您可能需要快速阅读哪些内容。假设您已经安装了内核源代码,请查看/usr/src/linux/Documentation/java.txt,了解直接使用内核的BINFMT_MISC支持运行java代码的方法(假设它被编译到您正在运行的内核版本中,但我认为大多数主要发行版上都有)。如果您没有安装源代码,您应该可以很容易地在网上找到它(以下是示例)。FYI,如果您想按原来的方式进行,它会是这样的:
$ 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
$cat jar.sh
#!/usr/bin/env bash
java-jarworks.jar
$chmod a+x works.jar
$./works.jar
假定最近的bash
支持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
!/bin/bash
JF=/tmp/junk$$.jar
(uudecode-o/dev/stdout>$JF;java-jar$JF;unlink$JF)或者我可以安装jarwrapper
(Ubuntu)包。除了"制作一些其他代码,运行代码< java > javaMyjar .jar >代码>。在第一个版本中,你是如何创建脚本的?你是否包含了一个有效的清单文件?请提供你所使用的命令。你可能需要考虑一些工具。但是这不是我真正想要的。我只想能够做<代码>。问题是,Java字节码不是可执行的,也不是脚本。当你使用/
执行某个东西时,shell期望这两种代码中的一种。我在看到@Gareth Davis的答案后发现了这一点:最好把它放在fstab
中,因为它在重新启动后不会工作。我没有jexec
(Kubuntu 12.04,OpenJDK 6)@bi99l35:当然可以。如果有问题,请发布错误。无效或损坏的jarfile/dev/fd/63
-这很有意义,因为块设备不是常规文件。