我有一个Debian Wheezy服务器,我想使用Jetty将Java Web应用程序部署为.war文件。我正在尝试配置Jetty以正确显示一个基本的jsp页面,以便我可以假设我有一个工作的Jetty服务器配置,然后才能走得太远。但是,我在配置JSP支持时遇到了一些问题,而且找不到特定于Debian的文档也没什么好运。
我已经通过jetty8
和libjetty8-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或者有任何想法我可能在尝试时出错?
答案 0 :(得分:1)
我在AWS上使用jetty8 / Ubuntu 12.10配置servlet注释,并遇到了类似的问题。好吧,至少在PeriodicEventListener NCDFE / CNF异常之前 - 在那之后,与你不同,我没有持久性来开始添加随机Tomcat JAR。 ; - )
就我而言,通过缩小start.config中的OPTIONS规范解决了问题。我懒得使用“全部”,这当然应该是合法的,但比严格要求更广泛。将规范更改为“注释,加上,默认,*”就可以了。我没有仔细研究过为什么,但我认为“All”加载的多余JAR之一有一个未解决的依赖。
答案 1 :(得分:0)
我已经能够通过以下几个步骤使其正常工作:
-
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