Невозможно загрузить класс для 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>
Надеюсь, это может помочь кому-то.