簡體   English   中英

如何在linux中直接執行jar?

[英]How do I directly execute a jar in linux?

我只想做./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讀取其他方式。 我真的希望我可以管它。 它會讓事情變得更容易:)

你需要一個名為jexec的服務,一些linux發行版帶有/etc/init.d/jexec安裝檢查。 我的CentOS 5.5絕對可以。

它的作用是使用binfmt系統注冊jexec解釋器。

有關更多信息,您可以快速閱讀binfmt_misc

假設您已安裝內核源代碼,請查看/usr/src/linux/Documentation/java.txt以獲取使用內核的BINFMT_MISC支持直接運行Java代碼的方法(假設它已編譯到您正在運行的內核版本中) ,但我認為它是在大多數主要的發行版上)。 如果您沒有安裝源代碼,您應該能夠在線輕松找到它(這是一個例子)。

僅供參考,如果您想以原始方式進行,它將如下所示:

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

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

寫一個單獨的shell腳本:

whatever.sh

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

您無法使JAR文件直接可執行,因為它不是可執行文件。 它是Java字節碼,不能由機器直接讀取,也不能由我知道的任何標准shell解釋器讀取。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM