Невозможно подключить сервлет с аннотацией @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
но безрезультатно.
2 ответа
Поддержка аннотаций Jetty была добавлена в версии 0.7.0. Обновите xsbt-web-plugin в вашем plugins.sbt, и вы должны быть готовы:
Проект / plugins.sbt:
addSbtPlugin("com.earldouglas" % "xsbt-web-plugin" % "0.7.0")
Я также рекомендую добавить build.properties, чтобы сохранить контроль над версией sbt, которую использует ваш проект:
проекта / build.properties:
sbt.version=0.13.1
Вот полный рабочий пример: https://earldouglas.com/ext/stackru.com/questions/20179351/
@WebServlet
вызов должен быть найден посредством сканирования аннотаций / классов.
В вашем списке зависимостей для Jetty отсутствует весь набор функций для сканирования аннотаций.
Добавьте это тоже.
"org.eclipse.jetty" % "jetty-annotations" % "9.0.7.v20131107" % "container",
"org.eclipse.jetty" % "jetty-plus" % "9.0.7.v20131107" % "container",