3

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

我已经通过jetty8andlibjetty8-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 中启用了 JSP 支持,方法是更改JETTY_ARGS​​为/etc/default/jetty8OPTIONS=default,jsp将 .war 放入$JETTY_HOME/webapps,然后重新启动 Jetty 服务器。

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

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.jarin $JETTY_HOME/lib/ext,然后导致我包含tomcat-juli.jar(更正 NoClassDefFoundError 的org.apache.juli.logging.LogFactory),最后tomcat-jasper-el.jar(更正 NoClassDefFoundError 的org.apache.el.ExpressionFactoryImpl)。

我的类路径中当前与 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

目录中的 jarsjsp是默认 Jetty 安装提供的那些,而我已将我的添加到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,或者有任何想法我可能在尝试时出错了?

4

2 回答 2

1

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

就我而言,通过缩小 start.config 中的 OPTIONS 规范来解决问题。我懒惰地使用了“All”,它当然应该是合法的,但比严格要求的要宽。将规范更改为“annotations,plus,default,*”就可以了。我还没有检查确切的原因,但我认为“All”加载的多余 JAR 之一具有未解决的依赖关系。

于 2013-05-13T13:27:09.117 回答
0

经过几个步骤后,我已经能够让它工作:

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

-

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="选项=默认,abc"

  • 启动码头8

灵感来自 James Page 的这篇文章:https ://lists.debian.org/debian-java/2012/05/msg00132.html

于 2014-03-17T12:09:22.000 回答