#java
#java
Вопрос:
На самом деле я произвел локальную настройку одного Java-приложения в tomcat, и на этот раз оно работает нормально, но через месяц оно снова выдает приведенную ниже ошибку без изменения какого-либо кода.
javax.servlet.ServletException: Servlet.init() for servlet action threw exception
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
java.lang.Thread.run(Thread.java:595)
основная причина
java.lang.NoClassDefFoundError
com.lexmark.efoundations.lxpd.gui.struts.ActionServlet.init(Unknown Source)
javax.servlet.GenericServlet.init(GenericServlet.java:212)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
java.lang.Thread.run(Thread.java:595)
Я также проверил, что упомянутый класс «com.lexmark.efoundations.lxpd.gui.struts.ActionServlet» присутствует в нужном месте.
Комментарии:
1. Вы говорите, что проверили, что оно «присутствует в надлежащем месте» — где именно оно у вас есть?
2. Наиболее распространенная причина этой ошибки, когда я знаю, что JAR на самом деле существует, заключается в том, что мне нужно убедиться, что более новая или более старая версия ожидаемого JAR не находится ранее в classpath.
3. Я проверил в «com.lexmark.efoundations.lxpd.gui.struts», что класс ActionServlet существует
4. Этот класс находится в WEB-INF / classes или в jar?
5. И это работает после перезагрузки сервера, верно?
Ответ №1:
Не уверен, связано ли это каким-либо образом: но это также может быть вызвано сбоем блока статического инициализатора в классе (что приводит к сбою загрузки класса, поэтому ClassDef отсутствует).
Комментарии:
1. Спасибо, Джеймс, но в этом классе у меня нет никакого статического блока.
2. Привет, Джеймс, возможно, вы правы, но как это решить. потому что я обнаружил, что приведенный ниже статический блок присутствует в class — static { try { // Create SessionFactory SessionFactory = new Configuration().configure().buildSessionFactory(); } catch (исключение HibernateException ex) { Log.fatal(«Проблема конфигурации гибернации: » ex.GetMessage()); выбросить новое исключение RuntimeException («Проблема конфигурации: » ex.GetMessage()); } }
3. Тогда просто исправьте свою конфигурацию гибернации на основе информации, предоставленной вашим
Log.fatal()
?
Ответ №2:
Для меня это похоже на истощение какого-то ресурса.
Не могут быть соединения, поскольку они не вызывают NoClassDefFound. Таким образом, должна быть память. Какая именно логика заставляет classloader внезапно забывать класс — я не готов сказать, но лекарство известно любому специалисту по операциям: автоматически перерабатывайте сервер в выходные.
P.S. Что интересно, это исключение из метода init (). Это означает, что создается новый экземпляр класса Servlet. Для каждого сервлета создается только один экземпляр класса, что означает, что приложение было повторно инициализировано. Если никто не прикасался к серверу, это может быть какой-то сбой Tomcat (опять же, может быть вызвано нехваткой ресурсов). Нужно читать журналы и много размышлять.