임베디드 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;
}
}