Я в конечном итоге сделал это, хотя я все еще задаюсь вопросом, существует ли более приятное решение. Для меня решение кажется более связанным с управлением плагинами в Maven plugin в целом, а не с самим Jetty. Плагины Maven добавляют к своим classpath то, что на самом деле определяется как зависимости плагина. Очевидно, что это также относится к плагину Jetty (если он также не реализует какой-либо другой механизм, который включен через конфигурацию, который еще предстоит обнаружить).
Я создал образец проекта и использовал предоставленную вами конфигурацию, имея то же самое ClassNotFoundException
. Я решил, что он добавляет в зависимость от Jetty-плагина сам проект (единственное решение?), То есть тот, который предоставляет настраиваемый класс обработчика.
Ниже рабочей POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.sample</groupId>
<artifactId>jetty-error</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.8.v20150217</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webApp>
<contextPath>/jetty-error</contextPath>
</webApp>
<httpConnector>
<port>7777</port>
</httpConnector>
<classesDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/classes</classesDirectory>
<jettyXml>src/main/resources/jetty.xml</jettyXml>
</configuration>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId>
<version>9.2.8.v20150217</version>
</dependency>
<dependency>
<groupId>com.sample</groupId>
<artifactId>jetty-error</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${basedir}/lib/jetty-error-0.0.1-SNAPSHOT.jar</systemPath>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>9.2.8.v20150217</version>
</dependency>
</dependencies>
</project>
Примечание: мой Packaing является war
, но это не должно иметь значение. Я также использовал область system
для зависимостей плагина в этом случае, неважно, это было просто для того, чтобы быстро заставить ее работать (у меня была проблема с моим репозиторием maven моей компании, и maven сначала не искал ее в кеше, но я не хотел исследовать дальше, это не было целью этого упражнения).
Таким образом, для быстрого тестирования, я временно создал jar
из проекта и добавлены в каталог lib
, но она может быть легко автоматизирована как часть сборки (я действительно хотел, чтобы доказать, что это должно было быть частью плагина Jetty Maven, а не сервера Jetty, чтобы он работал через jetty:run
).
Ниже мой простой обработчик ошибок:
package com.sample.jetty;
import java.io.IOException;
import java.io.Writer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.ErrorHandler;
public class MyErrorHandler extends ErrorHandler {
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.getOutputStream().println("error!");
}
public void handleErrorPage(HttpServletRequest request, Writer writer, int code, String message)
throws IOException {
writer.write("error!");
}
public void writeErrorPage(HttpServletRequest request, Writer writer, int code, String message, boolean showStacks)
throws IOException {
writer.write("error!");
}
public void writeErrorPageHead(HttpServletRequest request, Writer writer, int code, String message)
throws IOException {
writer.write("error!");
}
public void writeErrorPageBody(HttpServletRequest request, Writer writer, int code, String message,
boolean showStacks) throws IOException {
writer.write("error!");
}
public void writeErrorPageMessage(HttpServletRequest request, Writer writer, int code, String message, String uri)
throws IOException {
writer.write("error!");
}
public void writeErrorPageStacks(HttpServletRequest request, Writer writer) throws IOException {
writer.write("error!");
}
}
Ни один класс не найден исключение, используя его с вашей конфигурацией. Я также установить его в качестве глобальной, с помощью следующих молы конфигурации (jetty.xml
):
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"
"http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">
<Call name="addBean">
<Arg>
<New class="com.sample.jetty.MyErrorHandler">
<Set name="server"><Ref refid="Server" /></Set>
</New>
</Arg>
</Call>
</Configure>
, а затем ввести неверный адрес (т.е.http://localhost:7777/whatever
), я получил сообщение error!
от пользовательского обработчика ошибок (он работает!).
Итак, вывод: класс должен быть частью плагина, потому что на самом деле путь к классам при выполнении jetty:run
мы проводим плагин Maven.
Мой пример выше может быть улучшен далее (генерирование банки/загрузка банки в более стандартном подходе/папке maven (то есть не в системной области)), используйте проект мультимодального maven, имеющий обработчик ошибок в модуле и плагин причала в другом модуле, чтобы иметь зависимость от этого модуля и т. д.), но принцип, вероятно, будет таким же. Это было сложное и приятное исследование. Опытные учебные пособия и документация онлайн не очень помогают в этой теме.
Спасибо! Это выглядит многообещающе. Хотя я согласен, его довольно уродливый взлом :) Я попробую его и отчитаю! –
Вы также можете установить страницу с ошибкой в web.xml, хотя это не то же самое, но это предотвращает показ исключений для пользователя. – user1050755