Jetty 将 JETTY_ARGS 解释为文件名

Jetty 将 JETTY_ARGS 解释为文件名

我在 Ubuntu 10.04 上运行 Jetty(版本“null 6.1.22”)。它运行良好,直到我需要 JSP 支持。根据几篇博客文章,我需要将设置为JETTY_ARGSOPTIONS=Server,jsp但是,如果我将其放入/etc/default/jetty

JETTY_ARGS=OPTIONS=Server,jsp

并通过 重新启动 Jetty /etc/init.d/jetty stop && /etc/init.d/jetty start,它报告成功,但不接受连接。我注意到它将一些内容记录到/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/并尝试将该文件解析为 XML(或者它解析其他 XML 并尝试将该文件读取为 DTD?我不确定。)。这对我来说似乎没有任何意义,尤其是因为该目录完全是空的。我已经用其他几个字符串验证了这一点,而不仅仅是OPTIONS=Server,jsp

更新:

根据这一页在 Eclipsepedia 中,我应该能够通过调用来启动 Jetty:

java -jar start.jar OPTIONS=Server,jsp

这会产生与上述完全相同的异常。只需调用此方法即可,但同样不支持 JSP:

java -jar start.jar 

答案1

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

您在以下位置找到的任何文档eclipse.org/jetty/documentation/或者wiki.eclipse.org/Jetty不适合该版本的 Jetty。

使用存档文档docs.codehaus.org/display/JETTY/Jetty+Documentation反而。

事实上,您拥有 意味着/etc/init.d/jetty您很可能正在运行由某个 Linux 发行版构建的 Jetty。遗憾的是,在各种 Linux 发行版创建的 Jetty 软件包的启动和初始化过程中,尤其是在创建和捆绑的 中,存在许多错误/etc/init.d/jetty。Debian 和 Redhat 的各种错误跟踪系统是针对这些文件提交错误的地方。

您使用的命令行:

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

用于直接、独立执行,并且仅设计用于标准 Jetty 发行版dist.codehaus.org, 这maven.org 仓库, 或者下载网站

请注意,jetty-distribution 附带了 bin/jetty.sh,其中已进行了许多修复,以便适用于各种 sysvinit 系统。

然而,话虽如此,自从迁移到 eclipse(Jetty 7+)以来,Jetty 中的启动过程已经有了许多错误修复和改进,包括引入了start.ini,类似于 eclipse 本身的启动配置方式,这消除了您遇到的许多这类问题。

答案2

如果有人(像我一样)现在就开始做这件事......

正如 joakime 指出的那样,Jetty 6 不使用“OPTIONS=Server,jsp”方法来启用 JSP 支持。查看 Jetty 源代码后,我发现它只是尝试org.apache.jasper.servlet.JspServlet在类路径上定位类:如果找不到,它会发出上述错误消息。

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

我在 Ubuntu 14.04 中发现的另一个问题是,libjetty-extra-java来自 trusty-updates 的软件包版本 6.1.26-1ubuntu1.1 依赖于libtomcat7-java软件包(与来自 universe 的版本 6.1.26-1ubuntu1 相反,后者依赖于libtomcat6-java),但 Jasper 的符号链接/usr/share/jetty/lib/jsp-2.1已损坏,因为它们指向 提供的 JAR 名称libtomcat6-java,而不是 提供的JAR 名称libtomcat7-java。符号链接也是如此commons-el.jar,它也已损坏。修复这些问题后,会出现有关缺少 Tomcat 类的其他错误,可能是因为 Tomcat 7 Jasper 的依赖关系与 Tomcat 6 Jasper 不同。

我刚刚打开了 bughttps://bugs.launchpad.net/ubuntu/+source/jetty/+bug/1508562为了这。

答案3

Jetty 由 bin/jetty.sh 启动(查看来源第 477 行),其中运行命令的构建方式如下:

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 之前解析。这意味着如果未设置 JETTY_START,java 将尝试运行 JETTY_ARGS 返回的文件。因此,将 JETTY_HOME(在 JETTY_START 中使用)设置为正确的值应该可以解决您的问题。

相关内容