Jetty интерпретирует JETTY_ARGS как имя файла

Я использую Jetty (версия "null 6.1.22") в Ubuntu 10.04. Работает нормально, пока мне не нужна поддержка JSP. Согласно нескольким постам в блоге, мне нужно установить JETTY_ARGS в OPTIONS=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 

3 ответа

В случае, если кто-то (как я) получает на это сейчас...

Как указала joakime, Jetty 6 не использует подход "OPTIONS=Server,jsp" для включения поддержки JSP. Глядя на источник Jetty, я увидел, что он просто пытается найти класс org.apache.jasper.servlet.JspServlet на пути к классам: если он не может его найти, он жалуется на упомянутое сообщение об ошибке.

Простая установка пакета libjetty-extra-java должен решить проблему, потому что он добавляет символические ссылки в /usr/share/jetty/lib/jsp-2.1 в файлы JAR, которые автоматически добавляются в путь к классам Jetty при запуске. Для поддержки JSP эти символические ссылки указывают на JARS Jasper, приходящий от Tomcat, в частности от libtomcat?-javaпакет.

Дополнительная проблема, которую я обнаружил в Ubuntu 14.04, заключается в том, что пакет libjetty-extra-java версия 6.1.26-1ubuntu1.1, поступающая от trusty-updates, зависит от libtomcat7-java пакет (в отличие от версии 6.1.26-1ubuntu1, поступающей из юниверса, которая зависит от libtomcat6-java), но символические ссылки в /usr/share/jetty/lib/jsp-2.1 потому что Джаспер сломан, потому что они указывают на имена JAR, предоставленные libtomcat6-javaне те, которые предоставляются libtomcat7-java, То же самое относится и к commons-el.jar символическая ссылка, которая также сломана. Как только они исправлены, появляются другие ошибки, связанные с отсутствующими классами Tomcat, возможно потому, что у Tomcat 7 Jasper есть зависимости, отличные от Tomcat 6 Jasper.

Я только что открыл для этого баг https://bugs.launchpad.net/ubuntu/+source/jetty/+bug/1508562.

Часть в вашем выводе, которая говорит org.mortbay.start.Main.start означает, что вы используете версию Jetty (6.x или более раннюю).

Любая документация, которую вы нашли по адресу http://www.eclipse.org/jetty/documentation/ или http://wiki.eclipse.org/Jetty, не подходит для этой версии Jetty.

Вместо этого используйте архивную документацию по адресу http://docs.codehaus.org/display/JETTY/Jetty+Documentation.

Тот факт, что у вас есть /etc/init.d/jetty означает, что вы, вероятно, используете Jetty, созданный одним из дистрибутивов Linux. К сожалению, в процессе запуска и инициализации можно найти много ошибок в различных пакетах Jetty, созданных с помощью дистрибутива Linux, особенно с созданным и связанным /etc/init.d/jetty, Различные системы отслеживания ошибок в Debian и Redhat - это место, где можно регистрировать ошибки в этих файлах.

Командная строка, которую вы использовали:

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

предназначен для прямого, автономного выполнения и предназначен только для работы со стандартным дистрибутивом Jetty с http://dist.codehaus.org/jetty/, репозитория maven.org или http://download.eclipse.org/jetty/.

Обратите внимание, что дистрибутив jetty поставляется с bin / jetty.sh, в котором было много исправлений, которые были удобны для различных систем sysvinit.

Тем не менее, как уже говорилось, было много исправлений ошибок и улучшений в процессах запуска в Jetty после перехода к затмению (Jetty 7+), включая введение start.ini аналогично тому, как собственно eclipse можно настроить для запуска, что устранило многие из подобных проблем, с которыми вы столкнулись.

Jetty запускается с помощью bin/jetty.sh ( см. Строку источника 477), где команда run создается следующим образом:

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) на правильное значение должна решить вашу проблему.

Другие вопросы по тегам