NoClassDefFoundError в Tomcat 7
Мы столкнулись со странной проблемой в производстве. Наше веб-приложение развернуто в Tomcat 7. Мы используем Antisamy-1.5.3.jar для предотвращения XSS. Каждый пользовательский запрос перехватывается фильтром, который сканирует запросы на наличие вредоносного контента. В Tomcat 6 все было хорошо в течение более года. Мы перешли на Tomcat 7. Пользователи включают и выключают NoClassDefFoundError, когда открывают приложение (не согласовано), но при перезапуске Tomcat все работает нормально.
Ниже приведен поток, где выбрасывается исключение
Пользовательский запрос перехватывается AntiSamyFilter и вызывается метод сканирования класса owasp.validator.html.AntiSamy (внутренний класс AntiSamy).
Ниже приведен код для метода сканирования
public CleanResults scan(String taintedHTML, Policy policy) throws ScanException, PolicyException { return new AntiSamyDOMScanner(policy).scan(taintedHTML); }
Когда в коде выше упоминается класс AnitSamyDOMScanner, вызывается статический блок инициализации суперкласса AntiSamyDOMScanner - AbstractAntiSamyScanner, как показано ниже
private static ResourceBundle getResourceBundle() { try { return ResourceBundle.getBundle("AntiSamy", Locale.getDefault()); } catch (MissingResourceException mre) { } return ResourceBundle.getBundle("AntiSamy", new Locale("en", "US")); }
Именно здесь генерируется исключение, потому что tomcat по какой-то причине не может загрузить пакет ресурсов - файл AntiSamy_en_US.properties присутствует в файле jar на корневом уровне. Поскольку это ошибка в статическом блоке, ExceptionInInitializer выбрасывается, что в конечном итоге приводит к NoClassDefFoundError.
Ниже приведены два исключения, если смотреть вместе - мы видим, что NoClassDefFoundError вызывается из-за исключения в статическом блоке инициализации AbstractAntiSamyScanner.
SEVERE: Servlet.service() for servlet [jsp] in context with path [/app] threw exception [javax.servlet.ServletException: java.lang.NoClassDefFoundError: Could not initialize class org.owasp.validator.html.scan.AntiSamyDOMScanner] with root cause
java.lang.NoClassDefFoundError: Could not initialize class org.owasp.validator.html.scan.AntiSamyDOMScanner
at org.owasp.validator.html.AntiSamy.scan(AntiSamy.java:93)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:124)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
java.lang.NoClassDefFoundError: Could not initialize class org.owasp.validator.html.scan.AntiSamyDOMScanner StackTrace: javax.servlet.ServletException: java.lang.NoClassDefFoundError: Could not initialize class org.owasp.validator.html.scan.AntiSamyDOMScanner at
Мы пытались скопировать Antisamy.properties из Tomcat lib, а также WEB-INF/classes, но это не сработало. Любые мысли о том, что может привести к тому, что AbstractAntiSamyScanner не найдет пакет ресурсов в банке?