Jetty将JETTY_ARGS解释为文件名

我在Ubuntu 10.04上运行Jetty(version“null 6.1.22”)。 它运行良好,直到我需要JSP支持。 根据几个博客post,我需要将JETTY_ARGS设置为OPTIONS=Server,jsp 。 但是,如果我把它放到/etc/default/jetty

 JETTY_ARGS=OPTIONS=Server,jsp 

并通过/etc/init.d/jetty stop && /etc/init.d/jetty start重新启动Jetty,它报告成功,但不接受连接。 我注意到它logging了一些/usr/share/jetty/logs/out.log

 2012-09-11 11:19:05.110:WARN::EXCEPTION java.io.FileNotFoundException: /var/cache/jetty/tmp/OPTIONS=Server,jsp (No such file or directory) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.<init>(FileInputStream.java:137) at java.io.FileInputStream.<init>(FileInputStream.java:96) at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:87) at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:178) at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:630) at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:776) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:741) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1208) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:525) at javax.xml.parsers.SAXParser.parse(SAXParser.java:392) at org.mortbay.xml.XmlParser.parse(XmlParser.java:188) at org.mortbay.xml.XmlParser.parse(XmlParser.java:204) at org.mortbay.xml.XmlConfiguration.<init>(XmlConfiguration.java:109) at org.mortbay.xml.XmlConfiguration.main(XmlConfiguration.java:969) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.mortbay.start.Main.invokeMain(Main.java:194) at org.mortbay.start.Main.start(Main.java:534) at org.mortbay.jetty.start.daemon.Bootstrap.start(Bootstrap.java:30) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) at org.apache.commons.daemon.support.DaemonLoader.start(DaemonLoader.java:177) 

也就是说,无论我把它放到JETTY_ARGS中,它的解释都是作为/var/cache/jetty/tmp/中的文件名,并试图将该文件parsing为XML(或者parsing其他一些XML并尝试将该文件读为DTD ? 我不确定。)。 这对我来说似乎没有任何意义,尤其是因为该目录完全是空的。 我已经validation了这与其他几个string,不仅OPTIONS=Server,jsp

更新:

根据Eclipsepedia中的这个页面 ,我应该可以通过调用来启动Jetty:

 java -jar start.jar OPTIONS=Server,jsp 

这将创build与上述完全相同的例外。 只要调用这个工程,但是又没有JSP支持:

 java -jar start.jar 

输出中表示org.mortbay.start.Main.start表示您正在运行Jetty (6.x或更早版本)的一个版本 。

您在eclipse.org/jetty/documentation/或wiki.eclipse.org/Jettyfind的任何文档都不适合该版本的Jetty。

请使用docs.codehaus.org/display/JETTY/Jetty+Documentation上的归档文档。

事实上,你有一个/etc/init.d/jetty意味着你可能正在运行一个linux发行版构build的docker。 不幸的是在启动和初始化过程中发现了很多bug,特别是创build和捆绑的/etc/init.d/jetty 。 debian和redhat的各种bug跟踪系统是针对这些文件提出错误的地方。

您使用的命令行:

 $ java -jar start.jar OPTIONS=Server,jsp 

是直接的,独立的,执行的,只能用于从dist.codehaus.org , maven.org回购 ,或download.eclipse.org标准的docker发行。

请注意,jetty发行版带有一个bin / jetty.sh文件,这个文件夹有很多对于各种sysvinit系统友好的修复方法。

然而,就是说,自从start.ini到eclipse(Jetty 7+)以来,Jetty中的启动过程有很多错误修复和改进,其中包括引入start.ini ,类似于eclipse本身可以configuration为启动,消除了您遇到的许多这类问题。

如果有人(像我)现在就这样…

正如joakime指出的,Jetty 6不使用“OPTIONS = Server,jsp”方法来启用JSP支持。 看看Jetty源代码,我发现它只是试图在类path上find类org.apache.jasper.servlet.JspServlet :如果找不到它,就会抱怨上面提到的错误信息。

简单地安装libjetty-extra-java软件包应该可以解决这个问题,因为它将/usr/share/jetty/lib/jsp-2.1符号链接添加到启动时自动添加到Jetty classpath的JAR中。 对于JSP支持,这些符号链接指向来自Tomcat的Jasper libtomcat?-java ,特别是来自libtomcat?-java包。

我在Ubuntu 14.04中发现的另一个问题是,来自libjetty-extra-java版本6.1.26-1ubuntu1.1取决于libtomcat7-java软件包(与来自universe的版本6.1.26-1ubuntu1相反)取决于libtomcat6-java ),但是Jasper的/usr/share/jetty/lib/jsp-2.1的符号链接是坏的,因为它们指向由libtomcat6-java提供的JAR名称,而不是由libtomcat7-java提供的。 commons-el.jar符号链接也是commons-el.jar ,这也是破碎的。 一旦这些问题得到解决,就会出现其他有关丢失Tomcat类的错误,可能是因为Tomcat 7 Jasper与Tomcat 6 Jasper具有不同的依赖关系。

我刚刚为此打开了bug https://bugs.launchpad.net/ubuntu/+source/jetty/+bug/1508562

Jetty由bin / jetty.sh启动( 请参阅源代码行477),其中run命令的构build方式如下:

 JETTY_START=$JETTY_HOME/start.jar [ ! -f $JETTY_START ] && JETTY_START=$JETTY_HOME/lib/start.jar RUN_ARGS="$JAVA_OPTIONS -jar $JETTY_START $JETTY_ARGS $CONFIGS" RUN_CMD="$JAVA $RUN_ARGS" 

正如你所看到的,JETTY_START在JETTY_ARGS之前被parsing。 这意味着如果没有设置JETTY_START,java会尝试运行由JETTY_ARGS返回的文件。 因此,将JETTY_HOME(在JETTY_START中使用)设置为正确的值应该可以解决您的问题。