我正在运行一个嵌入式Jetty 8服务器,它在启动时加载一些* .war文件:
for (File aWebAppDirectory : aWebAppDirectories) {
if (aWebAppDirectory.exists() && aWebAppDirectory.isDirectory()) {
for (File warFile : aWebAppDirectory.listFiles(new WarFileFilter())) { String basename = warFile.getName().replaceFirst("\\.war$", "");
fHandlers.addHandler(new WebAppContext(warFile.getAbsolutePath(), "/" + basename));
}
}
}
这些war文件对类路径中可能存在或可能不存在的几个类有一些依赖。
现在如果我的一个servlet缺少一个依赖项,我的整个嵌入式Jetty服务都会失败。 (因为NoClassDefFoundExceptions)
我需要一种方法,允许我捕获失败的servlet的异常,而不是激活它们。我正在寻找与Servlet无法加载时TomCat所做的相同的事情:它仍然加载其余部分。
经过一段时间在Google上搜索后,我还没有找到任何解决方案。
任何人都知道如何使用嵌入式Jetty 8来解决这个问题?
答案 0 :(得分:0)
如果有人好奇我是如何解决的,我只是确保我的所有servlet都有一个基本上没有依赖关系的包装器servlet。包装器尝试初始化具有依赖项的委托,并显式检查NoClassDefFountException。如果发生这种情况,则委托设置为null,并且对包装器接口的所有调用都将导致异常。 所以在很高的层面上:
public class ServletWrapper extends HttpServlet{
private ServletDelegate fDelegate;
//If this is false, the delegate does not work, and we should not forward anything to it.
private boolean fAvailable = false;
public ServletWrapper(){
try{
fDelegate = new ServletDelegate();
fAvailable = true;
} catch (NoClassDefFoundError e) {
fAvailable = false;
}
}
@Override
protected void doPost( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
if ( !fAvailable || fDelegate==null ) {
response.sendError( HttpServletResponse.SC_SERVICE_UNAVAILABLE, LSP_MISSING_ERROR_MESSAGE );
return;
}
fDelegate.doPost(request,response);
}
}
这很简单,而且很有效。