2013-06-05 2 views
3

Я запускаю Jetty на платформе Android для обслуживания статических html-страниц и сервлета. Теперь я пытался добавить поддержку для страниц JSP, но я получил это исключение, когда я попросить любой JSP:JSP компиляция на Android (Jetty embedded)

HTTP ERROR 500 

Problem accessing /time.jsp. Reason: 

    Server Error 

Caused by: 

org.apache.jasper.JasperException: PWC6033: Error in Javac compilation for JSP 

PWC6199: Generated servlet error: 
The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files 

PWC6199: Generated servlet error: 
The type java.lang.Throwable cannot be resolved. It is indirectly referenced from required .class files 

PWC6199: Generated servlet error: 
The type java.lang.String cannot be resolved. It is indirectly referenced from required .class files 

PWC6199: Generated servlet error: 
org.apache.jasper.runtime.HttpJspBase cannot be resolved to a type 

PWC6199: Generated servlet error: 
org.apache.jasper.runtime.JspSourceDependent cannot be resolved to a type 

PWC6199: Generated servlet error: 
JspFactory cannot be resolved to a type 

PWC6199: Generated servlet error: 
JspFactory cannot be resolved 

PWC6199: Generated servlet error: 
java.util.List cannot be resolved to a type 

PWC6199: Generated servlet error: 
Syntax error, parameterized types are only available if source level is 1.5 or greater 

PWC6199: Generated servlet error: 
String cannot be resolved to a type 

PWC6199: Generated servlet error: 
org.glassfish.jsp.api.ResourceInjector cannot be resolved to a type 

PWC6199: Generated servlet error: 
java.util.List cannot be resolved to a type 

PWC6199: Generated servlet error: 
Syntax error, parameterized types are only available if source level is 1.5 or greater 

PWC6199: Generated servlet error: 
String cannot be resolved to a type 

PWC6199: Generated servlet error: 
_jspx_dependants cannot be resolved to a variable 

PWC6199: Generated servlet error: 
HttpServletRequest cannot be resolved to a type 

PWC6199: Generated servlet error: 
HttpServletResponse cannot be resolved to a type 

PWC6199: Generated servlet error: 
java.io.IOException cannot be resolved to a type 

PWC6199: Generated servlet error: 
ServletException cannot be resolved to a type 

PWC6199: Generated servlet error: 
PageContext cannot be resolved to a type 

PWC6199: Generated servlet error: 
HttpSession cannot be resolved to a type 

PWC6199: Generated servlet error: 
ServletContext cannot be resolved to a type 

PWC6199: Generated servlet error: 
ServletConfig cannot be resolved to a type 

PWC6199: Generated servlet error: 
JspWriter cannot be resolved to a type 

PWC6199: Generated servlet error: 
Object cannot be resolved to a type 

PWC6199: Generated servlet error: 
JspWriter cannot be resolved to a type 

PWC6199: Generated servlet error: 
PageContext cannot be resolved to a type 

PWC6199: Generated servlet error: 
_jspxFactory cannot be resolved 

PWC6199: Generated servlet error: 
_jspx_resourceInjector cannot be resolved to a variable 

PWC6199: Generated servlet error: 
org.glassfish.jsp.api.ResourceInjector cannot be resolved to a type 

PWC6197: An error occurred at line: 3 in the jsp file: /time.jsp 
PWC6199: Generated servlet error: 
java.util.Date cannot be resolved to a type 

PWC6199: Generated servlet error: 
Throwable cannot be resolved to a type 

PWC6199: Generated servlet error: 
SkipPageException cannot be resolved to a type 

PWC6199: Generated servlet error: 
ServletException cannot be resolved to a type 

PWC6199: Generated servlet error: 
_jspxFactory cannot be resolved 


    at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:129) 
    at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:299) 
    at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:392) 
    at org.apache.jasper.compiler.Compiler.compile(Compiler.java:453) 
    at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:625) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684) 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:457) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) 
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557) 
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1075) 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:384) 
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1009) 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) 
    at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52) 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) 
    at org.eclipse.jetty.server.Server.handle(Server.java:370) 
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489) 
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:949) 
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1011) 
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:644) 
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) 
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:668) 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) 
    at java.lang.Thread.run(Thread.java:856) 

Powered by Jetty:// 

Вот моя конфигурация код от основной деятельности:

public void startServer() 
{ 
     server = new Server(8080); 

     System.setProperty("org.apache.jasper.compiler.disablejsr199", "true"); 

     // Create a resource handler for static content. 
     ResourceHandler staticResourceHandler = new ResourceHandler(); 
     staticResourceHandler.setResourceBase(Environment.getExternalStorageDirectory().getAbsolutePath() + "/web/static/"); 
     staticResourceHandler.setDirectoriesListed(false); 

     // Create context handler for static resource handler. 
     ContextHandler staticContextHandler = new ContextHandler(); 
     staticContextHandler.setContextPath("/static"); 
     staticContextHandler.setHandler(staticResourceHandler); 

     // Create WebAppContext for JSP files. 
     WebAppContext webAppContext = new WebAppContext(); 
     webAppContext.setContextPath("/"); 
     webAppContext.setResourceBase(Environment.getExternalStorageDirectory().getAbsolutePath() + "/web/"); 
     webAppContext.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false"); 

     // Create servlet context handler for main servlet. 
     ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); 
     servletContextHandler.setContextPath("/servlet"); 
     servletContextHandler.setResourceBase(Environment.getExternalStorageDirectory().getAbsolutePath() + "/web/servlet/"); 

     terminalServlet = new TerminalServlet(this); 
     networkServlet = new NetworkDrawerServlet(this); 
     servletContextHandler.setClassLoader(Thread.currentThread().getContextClassLoader()); 
     servletContextHandler.addServlet(new ServletHolder(terminalServlet),"/terminal"); 
     servletContextHandler.addServlet(new ServletHolder(networkServlet),"/topology"); 
     //servletContextHandler.addServlet(new ServletHolder(new DefaultServlet()), "/*"); 

     // Create a handler list to store our static, jsp and servlet context handlers. 
     HandlerList handlers = new HandlerList(); 
     handlers.setHandlers(new org.eclipse.jetty.server.Handler[] { staticContextHandler, webAppContext, servletContextHandler }); 

     // Add the handlers to the server and start jetty. 
     server.setHandler(handlers); 
    try { 
     server.start(); 
    } catch (Exception e) { 
    } 
} 

Я помещаю файлы webserver (статический контент и файл jsp) в каталоге «/ web /» в extarnal storage (и он работает для статического контента, я установил права чтения и записи в файле манифеста).

Я думаю, что это общая проблема конфигирования под Android, потому что тот же код, скомпилированный и выполненный на рабочем столе, отлично работает.

ответ

4

JSP на Android невозможно.

Чтобы быть более точным, компиляция JSP на устройстве Android невозможна.

Существующие реализации JSPServlet будет пытаться собрать *.java источник в каталоге, *.class файлов, стандартный javac нет, так что вы думаете, вы можете опереться на реализацию JDT, написанной Затмения, чтобы сделать это, но даже это не будет работать по некоторым основным причинам.

  1. Базовая библиотека классов отсутствует в стандартных местах, которые ищет JDT-компилятор. Вот почему вы видите все ошибки «не могут разрешить».
  2. Компиляция в *.class файлов бесполезно на Android, так как само устройство Android не понимает *.class файлов. Это не Java, а Dalvik, который, оказывается, совместим (на этапе разработки/сборки) с Java.
  3. Android Dalvik VM ожидает обрезанного байт-кода, компилятор JDT не может это сделать.
  4. Я не знаю, на каком инструменте, библиотеке или утилите dexify на этом устройстве можно сделать этот последний шаг. Если он существует, вам нужно будет развить и изменить реализацию JSP, чтобы включить этот дополнительный шаг.

Если вы хотите развить в JSP и есть веб-приложение на андроид, это то, что вам нужно сделать:

  1. Снимите JSPServlet с вашего web.xml или webdefault.xml. Вы все равно не можете использовать его на Android.
  2. Предварительно скомпилируйте JSP на своей машине разработки.
  3. Обновите свой WEB-INF/web.xml, чтобы включить скомпилированные ссылки JSP. Посмотрите на различные инструменты JSPC там, все они поддерживают эту концепцию (либо как XML-фрагмент, подходящий для включения, либо путем прямой модификации существующего WEB-INF/web.xml.
  4. Dexify посткомпилированный WAR-файл с использованием методов, описанных в i -jetty проект.

Это позволит вам развиваться с JSPs, и использовать их на Android, но не сам необработанного *.jsp файл, а скомпилированный *.class files (которые затем dexified в формат Android байт-код) .

+0

Если бы я думал, что это через Я бы понял .class-> DEX функциональность просто не было. Хорошая добыча. Получил все, что работает, хотя и поразил его, насколько это возможно. – stu

Смежные вопросы