2

./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...

しかし、これは機能しません。

これを行う 1 つの方法は、ファイルを 2 つの別々の部分 (スクリプト部分と 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

2

カーネル ソース コードがインストールされていると仮定して、/usr/src/linux/Documentation/java.txt を調べて、カーネルの BINFMT_MISC サポートを使用して Java コードを直接実行する方法を確認してください (実行しているカーネルのバージョンにコンパイルされていると仮定します)。 、しかし、ほとんどの主要なディストリビューションにあると思います)。ソースがインストールされていない場合は、オンラインで簡単に見つけることができるはずです (例を次に示します)。

于 2012-06-15T15:55:48.653 に答える
1

java -jar は標準入力では機能しません。明らかに、直接の読み取りではなく、いくつかのシークを行います。mod できないシステムでは、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 に答える
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 に答える
0

別のシェルスクリプトを作成します。

何でも.sh

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

JARファイルは実行可能ファイルではないため、直接実行可能にすることはできません。これは、マシンや私が知っている標準のシェルインタープリターで直接読み取ることができないJavaバイトコードです。

于 2012-06-15T15:44:28.477 に答える
0

または、jarwrapper(Ubuntu)パッケージをインストールすることもできます。

于 2012-07-28T20:53:31.130 に答える