java ClassWithMainMethod
を呼び出すときにjvmが指定するのではなく、main
というエントリのメソッドを自動的に探すようにする方法はありますか?java:自動的にmainメソッドを持つクラスを見つけよう
言い換えれば、私はmain
メソッドを持つ多くのコンパイルされたクラスを持つディレクトリがあり、そのディレクトリだけを指定したいとします。
java ClassWithMainMethod
を呼び出すときにjvmが指定するのではなく、main
というエントリのメソッドを自動的に探すようにする方法はありますか?java:自動的にmainメソッドを持つクラスを見つけよう
言い換えれば、私はmain
メソッドを持つ多くのコンパイルされたクラスを持つディレクトリがあり、そのディレクトリだけを指定したいとします。
いいえ、それを行う方法はありません。あなたは、実行可能なjarファイルを作成し、あなたがが
java -jar MyJar.jar
を使用できるように、メインクラスは、JARマニフェストにあるものを定義することができます。
あなたはまた、あなたのための適切なコマンドを実行するスクリプトを使ってアプリを配信してもよいhttp://docs.oracle.com/javase/tutorial/deployment/jar/appman.html
を参照してください:
#startup.cmd
java -cp ... com.foo.bar.Main
アプリケーションが.jarファイル内にある場合は、メインクラスを指定することができますそのマニフェスト内に複数のクラスがある場合
実行可能なJarファイルを作成し、マニフェストファイルにmain関数を持つクラスを指定できると思います。したがって、ユーザーがjarファイルを実行するときはいつでも。主な機能を持つクラスが実行されます。
あなたのシナリオでは、場合:
javap
コマンドが使用できます。つまり、JREだけでなく、JDKがインストールされています。次のbashスクリプトを使用することができます
#!/usr/bin/env sh
for classfile in *.class; do
classname=$(echo $classfile | cut -f 1 -d '.')
echo $classname
if javap -public $classname | fgrep 'public static void main(java.lang.String[])'; then
java $classname "[email protected]"
fi
done
これは実際の行為ですが、 'main'関数はあなたのgrepコールが見逃す' final'キーワードで修飾することもできることに注意してください。また、作者が 'main(String ... args)'か 'main(String [] args)'を書いたかどうかによって、署名は異なります。この他の問題を解決するには、すぐ下の行に頼らなければなりません。 私たちは[キャミソールのサンドボックスプロジェクト](https://github.com/prologin/camisole/blob/master/camisole/languages/java.py)でそれをどのように扱っているのか分かります。 – zopieux
だろう、このようなクラスのJVMを見て? – Mat
ディレクトリ内のいくつかのクラスに 'main'メソッドがある場合はどうなりますか? –
JavaプログラムのメインクラスがJavaプロセスを起動するディレクトリにあるのはあまり一般的ではないので、「デフォルト」パッケージのクラスを悪いと見なすので、Javaはこれをそのまま実行しません練習。実際には、javaプログラムがディレクトリに '.class'ファイルしか持たないことは普通です。通常、あなたのアプリケーションと必要なライブラリと共に多数の' .jar'ファイルを配布し、それらの1つを実行するか、ランチャーを提供します起動時の制御を強化するスクリプト。 – millimoose