マニフェスト ファイルを含む 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 を単独で実行することと同じではないことに注意してください。