ฉันมีวิธีแก้ปัญหาแปลก ๆ ที่เรียกใช้แอปพลิเคชันสงครามในเซิร์ฟเวอร์ Jetty ในตัว แต่แอพเหล่านี้จำเป็นต้องทำงานบนเซิร์ฟเวอร์ Tomcat มาตรฐานด้วยและเรามีคุณสมบัติพิเศษบางอย่างใน manfest
ปัญหาคือเมื่ออยู่ใน Tomcat รายการสามารถอ่านได้ แต่เมื่ออยู่ในท่าเทียบเรือจะมีการสุ่มรายการขึ้นมา (ซึ่งพลาดคุณสมบัติพิเศษ)
จากคำตอบของ Alex Konshin ฉันได้หาวิธีแก้ปัญหาต่อไปนี้ (จากนั้นจะใช้อินพุตสตรีมในคลาส Manifest):
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;
}
}