Не удалось подключить сервлет с аннотацией @WebServlet в проекте SBT с использованием Jetty 9

Я столкнулся с проблемой во время работы над существующим проектом Java, который я преобразовал для использования SBT (ранее он был основан исключительно на Eclipse). Был сервлет (скажем, org.my.FooServlet), доступ к которому через веб-браузер был невозможен, несмотря на то, что Eclipse (все еще использовал Eclipse с sbteclipse) сообщал, что /FooServlet был сопоставлен с org.my.FooServlet.

Поэтому, чтобы исключить некоторые проблемы, которые могут возникнуть из-за преобразования проекта для использования SBT (например, некоторые отсутствующие зависимости или скрытые или кажущиеся не связанными (неправильные) проблемы с конфигурацией), я пошел дальше и создал новый проект SBT, чтобы попытаться воспроизвести задача с минимальной сложностью. Итак, в настоящее время у меня есть приведенная ниже конфигурация/код/вывод, и проблема все еще возникает:

container:start вывод:

[info] jetty-9.1.0.v20131115
[info] Started o.e.j.w.WebAppContext@33c4522{/,[file:/Users/erik.allik/code/scala/webtest/src/main/webapp/],AVAILABLE}
[info] Started ServerConnector@52879ec6{HTTP/1.1}{0.0.0.0:8080}
[success] Total time: 0 s, completed 25.11.2013 14:39:34

build.sbt:

scalaVersion := "2.10.3"

libraryDependencies ++= Seq(
  "org.eclipse.jetty" % "jetty-webapp" % "9.1.0.v20131115" % "container",
  "org.eclipse.jetty" % "jetty-jsp" % "9.1.0.v20131115" % "container",
  "org.eclipse.jetty" % "jetty-servlet" % "9.1.0.v20131115" % "container",
  "org.eclipse.jetty" % "jetty-servlets" % "9.1.0.v20131115" % "container",
  "org.eclipse.jetty" % "jetty-annotations" % "9.1.0.v20131115" % "container",
  "org.eclipse.jetty" % "jetty-plus" % "9.1.0.v20131115" % "container",
  "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" artifacts (Artifact("javax.servlet", "jar", "jar"))
)

seq(webSettings :_*)

project/plugins.sbt:

addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.4.2")

src/main/java/webtest/TestServlet.java:

package webtest;
// ...
@WebServlet(urlPatterns = { "/test" }, loadOnStartup = 1)
public class TestServlet extends HttpServlet {
    @Override public void init() { System.out.println("init"); }
    @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) { System.out.println("GET"); }
}

src/main/webapp/WEB-INF/web.xml: (полное удаление ничего не меняет)

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0" metadata-complete="false">
</web-app>

Контейнер перезагружается всякий раз, когда я редактирую и сохраняю любой из двух файлов кода, и файлы компилируются, поэтому, по крайней мере, SBT их подбирает; теперь вопрос, почему не Jetty. Я также пытался (в рамках исходного проекта, а не тестового фиктивного) скопировать все классы из-под target/scala-2.10/classes в src/main/webapp/WEB-INF/classes безрезультатно.


person Erik Kaplun    schedule 24.11.2013    source источник


Ответы (2)


Поддержка аннотаций Jetty была добавлена ​​в версии 0.7.0. Обновите xsbt-web-plugin в файле plugins.sbt, и все будет готово:

проект/plugins.sbt:

addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.7.0")

Я также рекомендую добавить build.properties, чтобы сохранить контроль над версией sbt, которую использует ваш проект:

project/build.properties:

sbt.version=0.13.1

Вот полный рабочий пример: https://earldouglas.com/ext/stackoverflow.com/questions/20179351/

person earldouglas    schedule 26.02.2014
comment
Я был тем, кто сообщил об этом, я думаю (или, по крайней мере, я помню, как участвовал в комментариях), так что я уже знал, что это сработало! Но хорошо, что теперь это на Stack Overflow! - person Erik Kaplun; 26.02.2014

Вызов @WebServlet необходимо будет найти с помощью сканирования аннотаций/классов.

В вашем списке зависимостей для Jetty отсутствует весь набор функций для сканирования аннотаций.

Добавьте их тоже.

"org.eclipse.jetty" % "jetty-annotations" % "9.0.7.v20131107" % "container",
"org.eclipse.jetty" % "jetty-plus" % "9.0.7.v20131107" % "container",
person Joakim Erdfelt    schedule 25.11.2013
comment
На самом деле я собирался отредактировать свой вопрос и изменить их - они у меня есть в libraryDependencies, и все еще ничего; Я также пытался добавить jetty-web.xml с настройками для org.eclipse.jetty.webapp.WebAppContext.setConfigurationClasses, чтобы содержать org.eclipse.jetty.annotations.AnnotationConfiguration, но на самом деле это вызывает java.lang.reflect.InvocationTargetException in file:/.../WEB-INF/jetty-web.xml, и я не смог определить причину этого. - person Erik Kaplun; 25.11.2013
comment
Примеры embedded-servlet-3.0 могут помочь, особенно Список конфигураций. - person Joakim Erdfelt; 25.11.2013
comment
Да, но посмотрите мой другой вопрос: stackoverflow.com/questions/20192300/ — похоже, невозможно добавить AnnotationConfiguration к WebAppContext.configurationClasses через jetty-web.xml. - person Erik Kaplun; 25.11.2013
comment
Нет, уже поздно их добавлять. Это серверная часть. Отвечу в другом вопросе. - person Joakim Erdfelt; 25.11.2013