Добавление настраиваемого обработчика на причал вызывает исключение ClassNotFoundException - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь внедрить собственный обработчик в причал.

Я написал обработчик в своем коде приложения, который упакован как война.

package com.foo.bar

import javax.servlet.http.{HttpServletRequest, HttpServletResponse}
import org.eclipse.jetty.server.Request
import org.eclipse.jetty.server.handler.AbstractHandler

// scalastyle:off println
class CustomJettyHandler extends AbstractHandler {
  override def handle(target: String, baseRequest: Request,
                      request: HttpServletRequest, response: HttpServletResponse): Unit = {

    println("This is a custom jetty handler")
  }
}
// scalastyle:on println

Затем я ввел это обработчик в файле jetty.xml:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
........
........
<Call name="insertHandler">
    <Arg>
      <New id="CustomJettyHandler" class="com.foo.bar.CustomJettyHandler"/>
    </Arg>
</Call>
........

Я сейчас запускаю причал в автономном режиме. Обратите внимание, что я передаю место, где находится CustomJettyHandler.class, в jetty-start.jar.

java -server -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog -jar lib/jetty-start.jar OPTIONS=All --lib=lib/* --lib=webapps/root/WEB-INF/classes/com/foo/bar/* etc/jetty.xml etc/jetty-jmx.xml --debug

В моих журналах приложений я вижу, что причал загружает мой собственный обработчик в свой путь к классам, но затем в конечном итоге сбой из-за ClassNotFoundException. Может ли кто-нибудь указать, где это могло пойти не так?

.......
rawlibref = webapps/root/WEB-INF/classes/com/foo/bar/*
expanded = webapps/root/WEB-INF/classes/com/foo/bar/*
getPaths('webapps/root/WEB-INF/classes/com/foo/bar/*')
Using relative path pattern: glob:**/webapps/root/WEB-INF/classes/com/foo/bar/*
Found [webapps/root/WEB-INF/classes/com/foo/bar/CustomJettyHandler.class]  /Users/...path_to_application.../webapps/root/WEB-INF/classes/com/foo/bar/CustomJettyHandler.class
Adding classpath component: /Users/...path_to_application.../webapps/root/WEB-INF/classes/com/foo/bar/CustomJettyHandler.class
.......
.......
.......
URLClassLoader.url[33] = file:/Users/...path_to_application.../webapps/root/WEB-INF/classes/com/foo/bar/CustomJettyHandler.class
Loaded 34 URLs into URLClassLoader
class org.eclipse.jetty.xml.XmlConfiguration - 9.4.24.v20191120
Command Line Args: /var/folders/z5/dmt38gq54kxcrrzpgvbl5m_c0000gp/T/start_6046998329479549547.properties /Users/...path_to_application.../etc/jetty.xml /Users/...path_to_application.../etc/jetty-jmx.xml
2020-05-27 14:46:13.676:INFO::main: Logging initialized @477ms to org.eclipse.jetty.util.log.StdErrLog
2020-05-27 14:46:13.934:INFO:oeju.TypeUtil:main: JVM Runtime does not support Modules
2020-05-27 14:46:14.007:WARN:oejx.XmlConfiguration:main: Config error at <Call name="insertHandler"><Arg>|      <New id="CustomJettyHandler" class="com.foo.bar.CustomJettyHandler"/>|    </Arg></Call> java.lang.ClassNotFoundException: com.foo.bar.CustomJettyHandler in file:///Users/...path_to_application.../etc/jetty.xml
2020-05-27 14:46:14.007:WARN:oejx.XmlConfiguration:main:
java.security.PrivilegedActionException: java.lang.ClassNotFoundException: com.foo.bar.CustomJettyHandler
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1837)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.jetty.start.Main.invokeMain(Main.java:218)
    at org.eclipse.jetty.start.Main.start(Main.java:491)
    at org.eclipse.jetty.start.Main.main(Main.java:77)
Caused by:
java.lang.ClassNotFoundException: com.foo.bar.CustomJettyHandler
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.eclipse.jetty.util.Loader.loadClass(Loader.java:64)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.newObj(XmlConfiguration.java:1028)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.itemValue(XmlConfiguration.java:1638)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.value(XmlConfiguration.java:1539)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.access$500(XmlConfiguration.java:369)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration$AttrOrElementNode.getList(XmlConfiguration.java:1768)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration$AttrOrElementNode.getList(XmlConfiguration.java:1744)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.call(XmlConfiguration.java:919)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:512)
    at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:454)
    at org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:354)
    at org.eclipse.jetty.xml.XmlConfiguration.lambda$main$0(XmlConfiguration.java:1874)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1837)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.jetty.start.Main.invokeMain(Main.java:218)
    at org.eclipse.jetty.start.Main.start(Main.java:491)
    at org.eclipse.jetty.start.Main.main(Main.java:77)

1 Ответ

0 голосов
/ 28 мая 2020

Откуда вы взяли эту командную строку?

java -server \
  -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog\
  -jar lib/jetty-start.jar\
  OPTIONS=All \
  --lib=lib/* \
  --lib=webapps/root/WEB-INF/classes/com/foo/bar/* \
  etc/jetty.xml \
  etc/jetty-jmx.xml \
  --debug

Это не подходит для использования с Jetty 9.x start.jar

Некоторые советы

  • не используйте XML непосредственно в командной строке java, это ответственность start.jar и модульной системы jetty-home (порядок СУПЕР ВАЖНО).
    Ваш выбор etc/jetty.xml and etc/jetty-jmx.xml является неполный список xmls. (у вас отсутствуют все зависимые XML файлы)
  • не редактируйте стандартные файлы Jetty XML, оставьте их, иначе вы усложните обновление позже. Вместо этого используйте XML, чтобы ввести свое поведение (см. Пример ниже)
  • OPTIONS не поддерживается Jetty 9.x (это поведение старой школы Codehaus / Jetty 6)
  • Ваше использование of --lib= не рекомендуется, он поддерживает только полные пути к jar-файлам или каталогам с разнесенными деревьями классов (не относительные пути, не поддерживаются глобусы).
  • -Dorg.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog - это жесткий sh способ настройки ведения журнала. Создайте файлы jetty-logging.properties и убедитесь, что они присутствуют в пути к классам.

Пример содержимого jetty-logging.properties

org.eclipse.jetty.util.log.class=org.eclipse.jetty.util.log.StdErrLog
org.eclipse.jetty.LEVEL=INFO
#org.eclipse.jetty.deploy.LEVEL=DEBUG

Сделайте это вместо этого.

Create XML на основе инъекции для вашего нового обработчика.

my-handler. xml

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">

<Configure id="Server" class="org.eclipse.jetty.server.Server">
    <Call name="insertHandler">
        <Arg>
            <New id="CustomJettyHandler" class="com.foo.bar.CustomJettyHandler" />
        </Arg>
    </Call>
</Configure>

Затем правильно создайте каталог вашей пристани (для причалов start.jar)

# Create your "jetty-base" directory
$ mkdir /path/to/myjettybase
$ cd /path/to/myjettybase

# Establish the basic files / directories / modules that you want to use
# You can find the configuration in start.ini or start.d/*.ini
$ java -jar /path/to/jetty-home/start.jar --add-to-start=http,jmx,deploy,ext,resources

# Copy your custom handler JAR into place
$ cp /path/to/my-handlers.jar /path/to/myjettybase/lib/ext/
# Copy your custom handler XML into place
$ cp /path/to/my-handler.xml /path/to/myjettybase/etc/
# Ensure that the custom handler XML is loaded into the jetty instance at the right point in the XML load order by declaring it to be used in a custom INI
$ mkdir start.d
$ echo "etc/my-handler.xml" >> start.d/my-handlers.ini

# Copy your jetty-logging.properties into place
$ cp /path/to/my-jetty-logging.properties /path/to/myjettybase/resources/jetty-logging.properties

# verify that your configuration looks sane (including the server classpath)
$ cd /path/to/myjettybase
$ java -jar /path/to/jetty-home/start.jar --list-config

# run your instance
$ cd /path/to/myjettybase
$ java -jar /path/to/jetty-home/start.jar

Но это еще не все, поскольку вы, похоже, хотите использовать jetty-home из проекта в стиле maven (или макета проекта), вы тоже можете это сделать!

Пример проекта, показывающий это, можно найти по адресу ...

https://github.com/jetty-project/servlet-error-page-handling

Этот проект maven также является допустимым каталогом jetty-base, подходящим для выполнения архивом jetty-home в другом месте на вашем компьютере.

...