如何在Debian Wheezy上的Jetty 8中启用JSP支持?

时间:2013-03-23 14:58:26

标签: jetty debian

我有一个Debian Wheezy服务器,我想使用Jetty将Java Web应用程序部署为.war文件。我正在尝试配置Jetty以正确显示一个基本的jsp页面,以便我可以假设我有一个工作的Jetty服务器配置,然后才能走得太远。但是,我在配置JSP支持时遇到了一些问题,而且找不到特定于Debian的文档也没什么好运。

我已经通过jetty8libjetty8-java软件包安装了Jetty 8,并通过IntelliJ IDEA创建了一个应用程序;生成的.war只包含一个index.jsp和一个WEB-INF / web.xml文件。 web.xml文件包含:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
</web-app>

index.jsp文件包含:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head><title>Test</title></head>
  <body>Test</body>
</html>

没有什么太花哨的了。然后我通过将JETTY_ARGS中的/etc/default/jetty8更改为OPTIONS=default,jsp,将.war放在$JETTY_HOME/webapps中,然后重新启动了Jetty服务器,从而在Jetty中启用了JSP支持。

尝试加载页面失败并在日志中留下此错误:

2013-03-22 22:39:38.914:INFO:oejs.Server:jetty-8.1.3.v20120416
2013-03-22 22:39:39.034:WARN:oejw.WebAppContext:Failed startup of context o.e.j.w.WebAppContext{,file:/var    /lib/jetty8/webapps/root/},file:/var/lib/jetty8/webapps/root/
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[...snip...]
        at org.eclipse.jetty.start.Main.invokeMain(Main.java:457)
        at org.eclipse.jetty.start.Main.start(Main.java:602)
        at org.eclipse.jetty.start.Main.main(Main.java:82)
Caused by:
java.lang.NoClassDefFoundError: org/apache/tomcat/PeriodicEventListener
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
[...snip...]
        at org.eclipse.jetty.start.Main.start(Main.java:602)
        at org.eclipse.jetty.start.Main.main(Main.java:82)

这导致我在tomcat-api.jar中添加了$JETTY_HOME/lib/ext,然后让我包含tomcat-juli.jar(更正org.apache.juli.logging.LogFactory的NoClassDefFoundError),最后tomcat-jasper-el.jar }(纠正org.apache.el.ExpressionFactoryImpl的NoClassDefFoundError。)

我在类路径中的当前与JSP相关的jar看起来像这样:

/usr/share/jetty8/lib$ ls -l jsp
total 0
lrwxrwxrwx 1 root root 28 Jun 25  2012 javax.el.jar -> ../../../java/el-api-2.2.jar
lrwxrwxrwx 1 root root 29 Jun 25  2012 javax.servlet.jsp.jar -> ../../../java/jsp-api-2.2.jar
lrwxrwxrwx 1 root root 25 Jun 25  2012 javax.servlet.jsp.jstl.jar -> ../../../java/jstl1.1.jar
lrwxrwxrwx 1 root root 31 Jun 25  2012 org.apache.jasper.jar -> ../../../java/tomcat-jasper.jar
lrwxrwxrwx 1 root root 26 Jun 25  2012 org.apache.taglibs.standard.jar -> ../../../java/standard.jar
/usr/share/jetty8/lib$ ls -l ext
total 0
lrwxrwxrwx 1 root root 28 Mar 23 09:59 tomcat-api.jar -> ../../../java/tomcat-api.jar
lrwxrwxrwx 1 root root 34 Mar 23 09:45 tomcat-jasper-el.jar -> ../../../java/tomcat-jasper-el.jar
lrwxrwxrwx 1 root root 29 Mar 23 09:43 tomcat-juli.jar -> ../../../java/tomcat-juli.jar

jsp目录中的jar是默认Jetty安装提供的,而我已将我的{j}添加到ext

我目前的错误是:

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:722)
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598)
[...snip...]
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
        at java.lang.Thread.run(Thread.java:679)

基于研究,如果我在.war中包含tomcat库,似乎可能会发生这种情况,但事实并非如此。我不完全确定从哪里开始,我没有运气找到涵盖此文件的文件。

有没有人成功地在Debian Wheezy中使用Jetty 8并启用JSP或者有任何想法我可能在尝试时出错?

2 个答案:

答案 0 :(得分:1)

我在AWS上使用jetty8 / Ubuntu 12.10配置servlet注释,并遇到了类似的问题。好吧,至少在PeriodicEventListener NCDFE / CNF异常之前 - 在那之后,与你不同,我没有持久性来开始添加随机Tomcat JAR。 ; - )

就我而言,通过缩小start.config中的OPTIONS规范解决了问题。我懒得使用“全部”,这当然应该是合法的,但比严格要求更广泛。将规范更改为“注释,加上,默认,*”就可以了。我没有仔细研究过为什么,但我认为“All”加载的多余JAR之一有一个未解决的依赖。

答案 1 :(得分:0)

我已经能够通过以下几个步骤使其正常工作:

  • 确保安装了以下软件包:libtomcat6-java, libecj-java,libjstl1.1-java,libservlet3.0-java,显然是jetty8。
  • 在/ usr / share / jetty8 / lib / abc中创建一个新目录。选择&#39; abc&#39;的名称。目录明智地说,它似乎有重大影响。 Jetty / Debian以某种方式按字母顺序对类路径或目录名称进行排序。
  • 在您的&#39; abc&#39;中添加以下符号链接:目录:

-

ecj.jar -> ../../../java/ecj.jar
jasper-el.jar -> ../../../java/jasper-el.jar
jasper.jar -> ../../../java/jasper.jar
jstl1.1.jar -> ../../../java/jstl1.1.jar
tomcat-el-api-2.2.jar -> ../../../java/tomcat-el-api-2.2.jar
tomcat-jsp-api-2.2.jar -> ../../../java/tomcat-jsp-api-2.2.jar
tomcat-juli.jar -> ../../../java/tomcat-juli.jar
  • 通过将以下行添加到/ etc / default / jetty8

    来配置jetty以使用新的lib目录

    JETTY_ARGS =&#34; OPTIONS =默认情况下,ABC&#34;

  • 启动jetty8

灵感来自詹姆斯佩奇的这篇文章:https://lists.debian.org/debian-java/2012/05/msg00132.html