2

メインクラスの名前を知らなくてもこれは可能ですか? 特に、アプリケーションの起動時に情報メールで送信したい実装バージョン プロパティの後にいます。これにアクセスするために私が知っている唯一の方法は、パッケージまたは情報にアクセスしたいjarファイルの名前を知ることです。メインクラスを探すだけではどうすればいいのかわかりません。

4

2 に答える 2

1

@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);
        }
于 2012-12-28T18:16:03.050 に答える
0

メインクラスについて知りたいのですが、その名前は知りたくないですか?

探しているものを見つけるには、次のことを行う必要があります。

  1. メインクラスを特定します(申し訳ありませんが、これは必須です)
  2. そのクラスがロードされた場所を見つける
  3. JAR ファイルの場合は、その JAR ファイルからマニフェストを読み込みます

ステップ 1 は難しい場合があります。メイン クラスを起動したスレッドが終了している可能性があります。たとえば、多くの GUI プログラムはClass.main(String[])メソッドを実行し、AWT スレッドがプロセスを維持している間に終了します。メイン クラスをまったく識別できない場合があります。その場合は、おそらく運が悪いです。システム プロパティを試すこともできますsun.java.commandが、それはおそらく Sun/Oracle JVM でのみ有効です。

ステップ 2 はかなり簡単です。 を取得してから、.class ファイル自体の URL を尋ねますClassClassLoader

ステップ 3 も非常に簡単です。JAR ファイルを開き、ファイルを探しMETA-INF/MANIFEST.MFます。

于 2012-12-28T17:21:24.610 に答える