我有一个 Debian Wheezy 服务器,我想使用 Jetty 将 Java Web 应用程序部署为 .war 文件。我正在尝试配置 Jetty 以正确显示基本的 jsp 页面,以便我可以假设我有一个工作的 Jetty 服务器配置,然后再走得太远。但是,我在配置 JSP 支持时遇到了一些问题,而且在查找 Debian 特定文档时运气不佳。
我已经通过jetty8
andlibjetty8-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/jetty8
,OPTIONS=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.jar
in $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,或者有任何想法我可能在尝试时出错了?