2012-01-15 3 views
1

java ClassWithMainMethodを呼び出すときにjvmが指定するのではなく、mainというエントリのメソッドを自動的に探すようにする方法はありますか?java:自動的にmainメソッドを持つクラスを見つけよう

言い換えれば、私はmainメソッドを持つ多くのコンパイルされたクラスを持つディレクトリがあり、そのディレクトリだけを指定したいとします。

+0

だろう、このようなクラスのJVMを見て? – Mat

+5

ディレクトリ内のいくつかのクラスに 'main'メソッドがある場合はどうなりますか? –

+1

JavaプログラムのメインクラスがJavaプロセスを起動するディレクトリにあるのはあまり一般的ではないので、「デフォルト」パッケージのクラスを悪いと見なすので、Javaはこれをそのまま実行しません練習。実際には、javaプログラムがディレクトリに '.class'ファイルしか持たないことは普通です。通常、あなたのアプリケーションと必要なライブラリと共に多数の' .jar'ファイルを配布し、それらの1つを実行するか、ランチャーを提供します起動時の制御を強化するスクリプト。 – millimoose

答えて

4

いいえ、それを行う方法はありません。あなたは、実行可能なjarファイルを作成し、あなたがが

java -jar MyJar.jar 

を使用できるように、メインクラスは、JARマニフェストにあるものを定義することができます。

あなたはまた、あなたのための適切なコマンドを実行するスクリプトを使ってアプリを配信してもよいhttp://docs.oracle.com/javase/tutorial/deployment/jar/appman.html

を参照してください:

#startup.cmd 
java -cp ... com.foo.bar.Main 
0

アプリケーションが.jarファイル内にある場合は、メインクラスを指定することができますそのマニフェスト内に複数のクラスがある場合

0

実行可能なJarファイルを作成し、マニフェストファイルにmain関数を持つクラスを指定できると思います。したがって、ユーザーがjarファイルを実行するときはいつでも。主な機能を持つクラスが実行されます。

5

あなたのシナリオでは、場合:

  • ディレクトリ内の最初のクラスファイルを実行しても大丈夫です。
  • このディレクトリ内のクラスはデフォルトパッケージに含まれています。
  • 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 
+1

これは実際の行為ですが、 'main'関数はあなたのgrepコールが見逃す' final'キーワードで修飾することもできることに注意してください。また、作者が 'main(String ... args)'か 'main(String [] args)'を書いたかどうかによって、署名は異なります。この他の問題を解決するには、すぐ下の行に頼らなければなりません。 私たちは[キャミソールのサンドボックスプロジェクト](https://github.com/prologin/camisole/blob/master/camisole/languages/java.py)でそれをどのように扱っているのか分かります。 – zopieux

関連する問題