そもそも、mainクラスが複数ある構成に問題があるのか?
「mainクラス」ではなくpublic static void main(String args)
を持つクラスが複数ある構成と解釈しての話になります。
結論から言うと特に問題はありません。後述するように実行時に指定できるからです。
複数のmainクラスがある場合、shellから実行するときはどのように実行すればよいか?
また、jar作成はどのようにすればよいか?
例えばこんな構成のjarファイルがあるとします。
META-INF/MANIFEST.MF
jardemo/
jardemo/Main1.class
jardemo/Main3.class
jardemo/Main2.class
Main1,Main2,Main3のクラスにはそれぞれ違うpublic static void main(String args)
を持っています。
このjarファイルを実行する際に動かすmainメソッドの指定はMANIFEST.MF
で行っています。Main-Class
属性で指定しています。
[MANIFEST.MF]
Manifest-Version: 1.0
Main-Class: jardemo.Main1
Class-Path: .
Eclipseだと実行可能jarファイルをエクスポートする際に起動構成から指定します。
コマンドラインで作成する場合は、eオプションでエントリーポイントを指定する方法が手っ取り早いかと思います。
(カレントディレクトリ)
├─bin
│ └─jardemo
│ Main1.class
│ Main2.class
│ Main3.class
│
└─src
└─jardemo
Main1.java
Main2.java
Main3.java
のディレクトリ構成の場合、以下のように指定します。
jar cvfe jardemo.jar jardemo.Main1 -C bin .
これでMain1.classのmainメソッドを実行するjarファイルが完成します。
また、このjarファイル中のMANIFEST.MFで指定されたMain-Class以外のエントリーポイントを実行したい場合は、以下のようにクラスパスにjarファイルを含めてmainメソッドを持つクラスを指定すればよいです。普通に.classファイルを実行時に指定する時と同様です。
java -cp ./jardemo.jar jardemo.Main2