Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在linux中直接执行jar?_Java_Linux_Bash_Jar_Executable Jar - Fatal编程技术网

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
-这很有意义,因为块设备不是常规文件。