メインクラスの名前を知らなくてもこれは可能ですか? 特に、アプリケーションの起動時に情報メールで送信したい実装バージョン プロパティの後にいます。これにアクセスするために私が知っている唯一の方法は、パッケージまたは情報にアクセスしたいjarファイルの名前を知ることです。メインクラスを探すだけではどうすればいいのかわかりません。
2 に答える
@Lee Meador からのコメントは、マニフェストを見つけるための良いヒントを示しています。jar 名を知る必要はありません。マニフェストを識別できる必要があるだけです。提案: 他の IMPLEMENTATION_* 属性の任意の組み合わせを使用して、正しいマニフェストを識別します。すでに IMPLEMENTATION_VERSION を設定している場合は、見つけられるように IMPLEMENTATION_NAME も設定してみませんか。取得したら、エントリを調べて、目的のエントリを見つけることができます。マニフェスト APIを使用すると、さらに簡単になります。
Attributes mainAtts = mf.getMainAttributes();
if(mainAtts.containsKey(Attributes.Name.MAIN_CLASS)){
String mainClass = mainAtts.getValue(Attributes.Name.MAIN_CLASS);
System.out.println(mainClass);
String mainVer = mainAtts.getValue(Attributes.Name.IMPLEMENTATION_VERSION);
System.out.println(mainVer);
}
メインクラスについて知りたいのですが、その名前は知りたくないですか?
探しているものを見つけるには、次のことを行う必要があります。
- メインクラスを特定します(申し訳ありませんが、これは必須です)
- そのクラスがロードされた場所を見つける
- JAR ファイルの場合は、その JAR ファイルからマニフェストを読み込みます
ステップ 1 は難しい場合があります。メイン クラスを起動したスレッドが終了している可能性があります。たとえば、多くの GUI プログラムはClass.main(String[])
メソッドを実行し、AWT スレッドがプロセスを維持している間に終了します。メイン クラスをまったく識別できない場合があります。その場合は、おそらく運が悪いです。システム プロパティを試すこともできますsun.java.command
が、それはおそらく Sun/Oracle JVM でのみ有効です。
ステップ 2 はかなり簡単です。 を取得してから、.class ファイル自体の URL を尋ねますClass
。ClassLoader
ステップ 3 も非常に簡単です。JAR ファイルを開き、ファイルを探しMETA-INF/MANIFEST.MF
ます。