Проблемы при использовании Jetty Embedded для обработки JSP. (JasperException: невозможно скомпилировать класс для JSP)

Я пытаюсь настроить Jetty Embedded для обработки JSP.

HelloServlet работает правильно, когда я набираю localhost:8080. Я получаю список файлов в папке jsp, когда набираю localhost:8080/jsp, но если я возьму index.jsp в папку, я получу исключение. JSP содержит только короткий текст HTML и эту строку в теле: <%= new java.util.Date() %>.

В чем может быть проблема?

Это исключение:

2013-07-08 16:29:10.007:WARN:oejs.ServletHandler:qtp1957204991-11: 
org.apache.jasper.JasperException: Unable to compile class for JSP
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:661)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:505)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:138)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:564)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:213)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1094)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:432)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1028)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)
    at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at org.eclipse.jetty.server.Server.handle(Server.java:445)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:267)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:224)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
    at java.lang.Thread.run(Unknown Source)
Caused by: 
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getClassLoader")
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at org.eclipse.jetty.server.handler.ContextHandler$Context.getClassLoader(ContextHandler.java:2161)
    at org.apache.jasper.compiler.TagPluginManager.init(TagPluginManager.java:83)
    at org.apache.jasper.compiler.TagPluginManager.apply(TagPluginManager.java:57)
    at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:240)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:505)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:138)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:564)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:213)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1094)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:432)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1028)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)
    at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at org.eclipse.jetty.server.Server.handle(Server.java:445)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:267)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:224)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
    at java.lang.Thread.run(Unknown Source)

Это мое приложение:

package main;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.webapp.WebAppContext;

public class SimplestServer
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server();
        ServerConnector connector = new ServerConnector(server);
        connector.setHost("127.0.0.1");
        connector.setPort(8080);
        server.addConnector(connector);

        WebAppContext webAppContext = new WebAppContext();
        webAppContext.setContextPath("/jsp");
        webAppContext.setResourceBase("./jsp/");
        webAppContext.setInitParameter("dirAllowed", "false");   

        ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
        servletContextHandler.setContextPath("/");
        servletContextHandler.addServlet(new ServletHolder(new HelloServlet()), "/*");

        HandlerList handlers = new HandlerList();
        handlers.setHandlers(new Handler[] { webAppContext, servletContextHandler });

        server.setHandler(handlers);    
        server.start();
        server.join();
    }
}

JSP-код:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "w3.org/TR/html4/loose.dtd">;
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Insert title here</title>
    </head>
    <body>
        <%= new java.util.Date() %>
    </body>
</html>

ОБНОВЛЕНИЕ:

Я решил предыдущую проблему таким образом. Теперь я снова в беде. Я ничего не менял, просто добавил новую строку в файл политики, и я получаю новое исключение, когда пытаюсь загрузить страницу jsp. ( org.apache.jasper.JasperException: java.lang.IllegalStateException: No org.apache.tomcat.InstanceManager set in ServletContext ) Я нашел несколько статей об этом, и это может произойти из-за того, что я вручную добавил библиотеку tomcat в свой проект. ( tomcat-juli.jar ). Однако, если я удаляю эту библиотеку из проекта, я получаю другое исключение (сразу после запуска приложения, а не тогда, когда я хочу загрузить JSP) ( java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory ). Это потому, что я добавил tomcat-juli.jar.

Это полная трассировка исключения IllegalStateException:

org.apache.jasper.JasperException: java.lang.IllegalStateException: No org.apache.tomcat.InstanceManager set in ServletContext
at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:177)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:505)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:138)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:582)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:213)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1094)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:432)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1028)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:261)
at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:101)
at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:546)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:505)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:138)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:564)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:213)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1094)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:432)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1028)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)
at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
at org.eclipse.jetty.server.Server.handle(Server.java:445)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:267)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:224)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
at java.lang.Thread.run(Unknown Source)
Caused by: 
java.lang.IllegalStateException: No org.apache.tomcat.InstanceManager set in ServletContext
    at org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(InstanceManagerFactory.java:35)
    at org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:171)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:505)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:138)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:582)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:213)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1094)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:432)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1028)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:261)
    at org.eclipse.jetty.server.Dispatcher.forward(Dispatcher.java:101)
    at org.eclipse.jetty.servlet.DefaultServlet.doGet(DefaultServlet.java:546)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:698)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:505)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:138)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:564)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:213)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1094)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:432)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:175)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1028)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136)
    at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at org.eclipse.jetty.server.Server.handle(Server.java:445)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:267)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:224)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:358)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:601)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:532)
    at java.lang.Thread.run(Unknown Source)

ОБНОВЛЕНИЕ 2: я добавил tomcat-juli.jar в библиотеки «Apache Tomcat v7.0». Так что на этот раз я не включаю банку в свое приложение, но все равно получаю исключение IllegalStateException. Кроме того, я не понимаю, почему приложение хочет использовать библиотеки tomcat, пока я использую Jetty.


person szedjani    schedule 08.07.2013    source источник
comment
Покажите нам свой JSP. Весь ли импорт на месте?   -  person AllTooSir    schedule 08.07.2013
comment
@TheNewIdiot обратите внимание, что OP использует полное имя класса, поэтому в импорте нет необходимости.   -  person Luiggi Mendoza    schedule 08.07.2013
comment
Настоящая проблема заключается в том, как вы выполняете свое приложение, а не в своем jsp. Связано: stackoverflow.com/q/7892325/1065197   -  person Luiggi Mendoza    schedule 08.07.2013
comment
Да, я использовал полное имя. Файл содержит только это: ‹%@ page language=java contentType=text/html; charset=ISO-8859-1 pageEncoding=ISO-8859-1%› ‹!DOCTYPE html PUBLIC --//W3C//DTD HTML 4.01 Transitional//EN w3.org/TR/html4/loose.dtd› ‹html› ‹head› ‹meta http-equiv=Content-Type content=text/html ; charset=ISO-8859-1› ‹title›Вставьте заголовок здесь‹/title› ‹/head› ‹body› ‹%= new java.util.Date() %› ‹/body› ‹/html›   -  person szedjani    schedule 08.07.2013
comment
@szedjani Я отредактировал ваш вопрос, чтобы отразить ваш контент JSP. Обратите внимание, что такой код следует добавлять в ваш вопрос, а не в комментарии.   -  person Luiggi Mendoza    schedule 08.07.2013
comment
@LuiggiMendoza Большое спасибо. Знаете ли вы, где я могу найти сценарий запуска, если я использую Jetty Embedded?   -  person szedjani    schedule 08.07.2013
comment
Это зависит от того, как вы выполняете свое приложение. Если в Eclipse, посмотрите здесь: stackoverflow.com/q/7574543/1065197. Если NetBeans, проверьте: netbeanside61.blogspot.com/2009 /02/. Если другой, поищите в сети. Если напрямую из командной строки, то еще проще.   -  person Luiggi Mendoza    schedule 08.07.2013
comment
@LuiggiMendoza Обратите внимание, что комментарий был сделан до того, как OP отредактировал вопрос, включив в него код JSP :)   -  person AllTooSir    schedule 08.07.2013
comment
@TheNewIdiot обратите внимание, что код JSP не имеет отношения к проблеме. Просто проверьте трассировку стека: Вызвано: java.security.AccessControlException: доступ запрещен (java.lang.RuntimePermission getClassLoader)   -  person Luiggi Mendoza    schedule 08.07.2013
comment
@TheNewIdiot Примечание. Луиджи Мендоса редактировал вопрос, а не я. :)   -  person szedjani    schedule 08.07.2013


Ответы (2)


Я решил вопросы. Я не знаю, какое было реальное решение исходной проблемы, но так оно и работает.

Поэтому я изменил целевую среду выполнения нового проекта на J2EE Preview вместо Apache Tomcat v7.0. (В Eclipse: Файл -> Создать -> Динамический веб-проект -> Новая среда выполнения -> Базовая -> Предварительная версия J2EE). Затем я скопировал весь файл в этот проект.

После этого у меня возникла небольшая проблема. Программа не нашла jasper.jar, чем tools.jar, поэтому я добавил их в проект вручную. (tools.jar находится в папке lib JDK, а jasper.jar является частью библиотеки Apache Tomcat v7.0.) И это работает.

person szedjani    schedule 09.07.2013

Я решил это, используя приведенную ниже конфигурацию в jetty-web.xml.

<Get name="ServletContext">
  <Call name="setAttribute">
    <Arg>org.eclipse.jetty.containerInitializers</Arg>
    <Arg>
      <Array type="org.eclipse.jetty.plus.annotation.ContainerInitializer">
        <Item>
          <New class="org.eclipse.jetty.plus.annotation.ContainerInitializer">
            <Arg>
              <New class="org.eclipse.jetty.apache.jsp.JettyJasperInitializer"></New>
            </Arg>
          </New>
        </Item>
      </Array>
    </Arg>
  </Call>
  <Call name="setAttribute">
    <Arg>org.apache.tomcat.InstanceManager</Arg>
    <Arg>
      <New class="org.apache.tomcat.SimpleInstanceManager"></New>
    </Arg>
  </Call>
</Get>

Версия причала: 9.3.8

Для встроенного причала см.: https://github.com/jetty-project/embedded-jetty-jsp/blob/master/src/main/java/org/eclipse/jetty/demo/Main.java

person Kunnu    schedule 13.05.2016