Apache Tomcat で実行されている Web アプリケーションのマニフェスト ファイルを読み取るにはどうすればよいでしょうか? 質問する

Apache Tomcat で実行されている Web アプリケーションのマニフェスト ファイルを読み取るにはどうすればよいでしょうか? 質問する

マニフェスト ファイルを含む Web アプリケーションがあり、Ant ビルド タスク中にアプリケーションの現在のバージョンをそこに書き込みます。マニフェスト ファイルは正しく作成されますが、実行時に読み込もうとすると、奇妙な副作用が発生します。マニフェストを読み込むためのコードは次のようになります。

    InputStream manifestStream = Thread.currentThread()
                                 .getContextClassLoader()
                                 .getResourceAsStream("META-INFFFF/MANIFEST.MF");
    try {
        Manifest manifest = new Manifest(manifestStream);
        Attributes attributes = manifest.getMainAttributes();
        String impVersion = attributes.getValue("Implementation-Version");
        mVersionString = impVersion;
    }
    catch(IOException ex) {
        logger.warn("Error while reading version: " + ex.getMessage());
    }

Eclipse を Tomcat に接続すると、上記のコードが機能しているのがわかりますが、期待したものとは異なるマニフェスト ファイルを取得しているようです。これは、Ant のバージョンとビルド タイムスタンプが両方とも異なることからわかります。次に、そこに「META-INFFFF」と入力すると、上記のコードがまだ機能します。これは、自分のマニフェストではなく、別のマニフェストを読み込んでいることを意味します。また、

this.getClass().getClassLoader().getResourceAsStream(...)

しかし、結果は同じでした。Tomcat で実行されている Web アプリケーション内からマニフェスト ファイルを読み取る適切な方法は何ですか?

編集: これまでのご提案に感謝します。また、私は午前tomcat をスタンドアロンで実行します。コマンド ラインから起動し、Eclipse のデバッガーで実行中のインスタンスに接続します。違いはないはずですよね?

ベストアンサー1

おそらく、副作用は、ほとんどすべての jar に MANIFEST.MF が含まれており、正しいものを取得していないという事実から生じています。Web アプリから MANIFEST.MF を読み取るには、次のようにします。

ServletContext application = getServletConfig().getServletContext();
InputStream inputStream = application.getResourceAsStream("/META-INF/MANIFEST.MF");
Manifest manifest = new Manifest(inputStream);

Eclipse はクラスローダーを操作するため、Eclipse から Tomcat を実行することは、Tomcat を単独で実行することと同じではないことに注意してください。

おすすめ記事