Невозможно загрузить класс для JSP

Трассировка стека исключений

org.apache.jasper.JasperException: Unable to load class for JSP
 org.apache.jasper.JspCompilationContext.load(JspCompilationContext.java:599)
 org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:143)
 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:321)
 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

java.lang.ClassNotFoundException: org.apache.jsp.redirect_jsp
 java.net.URLClassLoader$1.run(Unknown Source)
 java.security.AccessController.doPrivileged(Native Method)
 java.net.URLClassLoader.findClass(Unknown Source)
 org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:131)
 org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:63)
 org.apache.jasper.JspCompilationContext.load(JspCompilationContext.java:597)
 org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:143)
 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:321)
 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:308)
 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

Содержимое моего redirect.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<% response.sendRedirect("user/list.htm"); %>

Ответы

Ответ 1

Под обложками servletcontainer JSP скомпилируются в классы Java до их выполнения.

Исключение

java.lang.ClassNotFoundException: org.apache.jsp.redirect_jsp

означает, что файл redirect.jsp в корне вашей папки webcontent не удалось скомпилировать, что, в свою очередь, часто означает, что он содержит некорректный код Java в сценариях <% %>, который содержит синтаксические ошибки. Вам нужно исправить эти синтаксические ошибки, чтобы servletcontainer мог скомпилировать эти JSP файлы. Однако общий консенсус заключается в том, что сценарии являются плохими практиками. Вы должны подумать, не будет ли этот Java-код лучше принадлежать полноценному Java-классу, управляемому Servlet или Filter.

Другая возможная причина заключается в том, что рабочий кэш контейнера servlet запутан. Это может произойти при разработке с использованием слабого плагина IDE. Вы хотите очистить кэш работы. Например, в Eclipse вы можете сделать это, щелкнув правой кнопкой мыши на сервере и выбрав "Очистить". В противном случае это нужно сделать вручную, удалив все в кеше работы рассматриваемого сервлетконтейнера. В случае, например, Tomcat, тогда все в своей папке /work.

Ответ 2

Это может произойти без видимой причины, когда у вас заканчивается дисковое пространство. Tomcat can not создает файл класса, но идет вперед и ненадлежащим образом предполагает, что он был успешным, а затем жалуется на последнее.

Ответ 3

Другой причиной этого исключения может быть отсутствие разрешения на запись. Если tomcat был запущен на Linux-машине пользователем root, он создаст каталог work/с корнем владельца. Если вы попытаетесь запустить tomcat со специальным пользователем с меньшими разрешениями, из-за этого он не сможет скомпилировать JSP файлы. Таким образом, вы можете попробовать два решения:

  • Изменение владельца рабочей папки tomcat с помощью chown tomcat_user -R work/
  • Удалите рабочий каталог перед запуском tomcat как пользователь с меньшими разрешениями с помощью rm -R work/

Ответ 4

Я получал эту ошибку, потому что у меня была зависимость JSP API в моей WAR pom.xml:

<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.1</version>
  <scope>compile</scope>
</dependency>

Сменив это на это, он зафиксировал это:

<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.1</version>
  <scope>provided</scope>
</dependency>

Предполагается, что это связано с тем, что на этапе компиляции присутствует дублирующий класс. Без BalusC, объясняющего это вопрос компиляции, о котором я бы никогда не догадался!

Ответ 5

Мне также пришлось столкнуться с этой проблемой, связанной с библиотечными файлами jar, такими как jetty-util-6.0.0rc0.jar, jasper-compiler-jdt-5.5.23.jar, jasperreports-3.0.0.jar. Мой ответ может быть неправильным, потому что сейчас я новичок, но по крайней мере вы можете попробовать... Спасибо,

Ответ 6

У меня была аналогичная проблема на примере spring template Spring MVC hello world, созданного IntelliJ. InternalResourceViewResolver не разрешит файл Hello_JSP.java. Мне пришлось изменить его на следующую зависимость

<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency>

Надеюсь, это может помочь кому-то.