2013-11-24 4 views
0

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

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

container:start выход:

[info] jetty-9.1.0.v20131115 
[info] Started [email protected]{/,[file:/Users/erik.allik/code/scala/webtest/src/main/webapp/],AVAILABLE} 
[info] Started [email protected]{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> 

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

ответ

1

Поддержка аннотаций на причал added in version 0.7.0. Обновление xsbt-веб-плагин в вашем plugins.sbt и вы должны быть хорошо идти:

проект/plugins.sbt:

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

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

проект/сборка.Свойства:

sbt.version=0.13.1 

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

+0

Я был тем, кто сообщил об этом, я думаю (или, по крайней мере, я помню, что участвовал в комментариях), поэтому я уже знал, что это сработало! Но хорошо иметь это на переполнении стека сейчас! –

0

Звонок @WebServlet должен быть найден через сканирование аннотаций/классов.

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

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

"org.eclipse.jetty" % "jetty-annotations" % "9.0.7.v20131107" % "container", 
"org.eclipse.jetty" % "jetty-plus" % "9.0.7.v20131107" % "container", 
+0

На самом деле я собирался изменить мой вопрос и не изменить их, я их в 'libraryDependencies' и до сих пор ничего; Я также попробовал добавить 'jetty-web.xml' с настройками для' org.eclipse.jetty.webapp.WebAppContext.setConfigurationClasses', чтобы содержать 'org.eclipse.jetty.annotations.AnnotationConfiguration', но это фактически вызывает' java.lang.reflect.InvocationTargetException в файле: /.../ WEB-INF/jetty-web.xml', и я не смог определить причину этого. –

+0

Примеры [embedded-servlet-3.0] (https://github.com/jetty-project/embedded-servlet-3.0/) могут помочь, в частности, [Список конфигураций] (https://github.com/jetty- проект/встраиваемого сервлет-3,0/BLOB/Master/SRC/тест/Java/COM/компании/Foo/EmbedMe.java # L25-L29). –

+0

Да, но см. Мой другой вопрос: http://stackoverflow.com/questions/20192300/java-lang-reflect-invocationtargetexception-in-jetty-web-xml-when-setting-webapp -it, похоже, не можно добавить 'AnnotationConfiguration' в' WebAppContext.configurationClasses' через 'jetty-web.xml'. –

Смежные вопросы