組み込みJettyサーバーでwarアプリケーションを実行するこの奇妙なソリューションがありますが、これらのアプリケーションは標準のTomcatサーバーでも実行する必要があり、manfestにはいくつかの特別なプロパティがあります。
問題は、Tomcatではマニフェストを読み取ることができたが、突堤ではランダムなマニフェストがピックアップされた(特別なプロパティが欠落していた)ことでした。
Alex Konshinの答えに基づいて、次の解決策を思いつきました(入力ストリームはマニフェストクラスで使用されます)。
private static InputStream getWarManifestInputStreamFromClassJar(Class<?> cl ) {
InputStream inputStream = null;
try {
URLClassLoader classLoader = (URLClassLoader)cl.getClassLoader();
String classFilePath = cl.getName().replace('.','/')+".class";
URL classUrl = classLoader.getResource(classFilePath);
if ( classUrl==null ) return null;
String classUri = classUrl.toString();
if ( !classUri.startsWith("jar:") ) return null;
int separatorIndex = classUri.lastIndexOf('!');
if ( separatorIndex<=0 ) return null;
String jarManifestUri = classUri.substring(0,separatorIndex+2);
String containingWarManifestUri = jarManifestUri.substring(0,jarManifestUri.indexOf("WEB-INF")).replace("jar:file:/","file:///") + MANIFEST_FILE_PATH;
URL url = new URL(containingWarManifestUri);
inputStream = url.openStream();
return inputStream;
} catch ( Throwable e ) {
// handle errors
LOGGER.warn("No manifest file found in war file",e);
return null;
}
}