Java呼び出しを使用せずにJavaプログラムを起動する

Java呼び出しを使用せずにJavaプログラムを起動する

端末でクラスファイルを呼び出してJavaプログラムを起動できると便利です(GUIをダブルクリックすると端末で実行できますが、それほど重要ではありません)。これまで、私は次のような一時的な修正にのみ役立ちました。

alias cs='java charstat.Charstat'

Linux は次のファイルを Java として認識します。

 charstat/Charstat.class: compiled Java class data, version 52.0 (Java 1.8)

それでは、電話を有線で接続する方法はありますか?ここにUbuntu 16.04がありますが、一般的な答えを歓迎します。


問題が終了し、トラブルシューティング部分が始まります。


修正する

これまでの最も有望な行動方針は、Gillesが提案したものです。だから私は以下を実行しました。

echo ":java-class:M:0:cafebabe::/usr/bin/java:" | sudo tee /proc/sys/fs/binfmt_misc/register

今、

tomasz@tomasz-Latitude-E4200:~/Desktop$ cat /proc/sys/fs/binfmt_misc/java-class
enabled
interpreter /usr/bin/java
flags: 
offset 0
magic 6361666562616265

しかし、

tomasz@tomasz-Latitude-E4200:~/Desktop$ ./Void.class 
bash: ./Void.class: cannot execute binary file: Exec format error

これはUbuntu 14.04で行われました。それは以下を持っています:

binfmt-support/trusty,now 2.1.4-1 amd64 [installed,automatic]
  Support for extra binary formats

重要な場合は、16.04に自動的にインストールされないようです。

昨日、Mark Plotnickのコメントに基づいて、私は次のように言いました。このガイド、役に立たない。/usr/local/bin/javawrapperGillesのソリューションには含まれていないラッパーが導入されました。しかし、これはArch Linux用です。

アップデート2(Ubuntu 16.06)

16.06:

tomasz@tomasz-Latitude-E4200:~/Desktop/io$ cat /proc/sys/fs/binfmt_misc/Java 
enabled
interpreter /usr/local/bin/javawrapper
flags: 
offset 0
magic cafebabe

そして、

tomasz@tomasz-Latitude-E4200:~/Desktop/io$ ./Nain.class 
bash: ./Nain.class: No such file or directory

アップデート3

後ろにecho ":java-class:M:0:\xca\xfe\xba\xbe::/usr/bin/java:" | sudo tee /proc/sys/fs/binfmt_misc/register:

tomasz@tomasz-Latitude-E4200:~/Desktop/io$ java Main 
Please input the file location and name.
^Ctomasz@tomasz-Latitude-E4200:~/Desktop/io$ ./Main.class 
Error: Could not find or load main class ..Main.class

参考までに:

tomasz@tomasz-Latitude-E4200:/proc/sys/fs/binfmt_misc$ cat java-class 
enabled
interpreter /usr/bin/java
flags: 
offset 0
magic cafebabe

答え1

Linux

Ubuntuはすでにjarに対してこれを行っています。とともにopenjdk-8-jreパッケージ(および以前のバージョン)jar呼び出しが実行されますjexec。クラスに対してはこれは行われません。それはおそらく、クラスがライブラリではなくスタンドアロンの実行可能ファイルであることがほとんどないからです(つまり、jarにも同じことが当てはまります)。

クラスを処理するために同じ基本メカニズムを設定できます。このメカニズムはLinuxbinfmt_miscカーネルがヘルパープログラムを介して任意のファイルを実行できるようにする機能です。

javaJavaのコマンドラインは本当に奇妙なので、ファイル名をコマンドが実行できる名前に変換するにはラッパーを使用する必要があります。このスクリプトを別の名前で保存し/usr/local/bin/javarunて実行可能にします。

#!/bin/sh
case "$1" in
  */*) dir="${1%/*}"; base="${1##*/}";;
  *) dir="."; base="$1";;
esac
shift
case "$base" in
  [!-]*.class) base="${base%.*}";;
  *) echo >&2 "Usage: $0 FILENAME.class [ARGS...]"; exit 127;;
esac
case "$CLASSPATH" in
  "") exec java -cp "$dir" "$base" "$@";;
  *) exec java -cp "$dir:$CLASSPATH" "$base" "$@";;
esac

次のコマンドはクラスで機能します。よりhttps://unix.stackexchange.com/a/21651そしてカーネル文書 説明のために。

echo ":java-class:M:0:\xca\xfe\xba\xbe::/usr/local/bin/javarun:" | sudo tee /proc/sys/fs/binfmt_misc/register

有効にするには一度実行してください。設定を削除するには、を実行しますsudo rm /proc/sys/fs/binfmt_misc/java-class。設定に満足したら、次のコマンドを追加します/etc/rc.local

echo >/proc/sys/fs/binfmt_misc/register ":java-class:M:0:\xca\xfe\xba\xbe::/usr/local/bin/javarun:"

ジッシュ

使用する場合扱いにくいシェルとして、以下を定義して、拡張子に基づいてファイルを実行させることができます。サフィックスエイリアス

alias -s class=javarun

javarun上記と同じスクリプトが必要です。もちろん、これはbash、ファイルマネージャ、スクリプト(このコマンドを実行するzshスクリプトを除く)ではなくzshでのみ機能します。

答え2

「.class」のmailcapプロジェクトを定義し、ブラウザ(またはデスクトップランチャー)がそれを使用するように説得できます。

しかし、これは単なる変更です。どの実行を開始するために実行するプログラムです(実際の節約はありません)。デスクトップランチャーも同様です。

追加資料:

関連情報