无法使用Jetty 9将servlet与使用Jetty 9的SBT项目中的@WebServlet注释挂钩

时间:2013-11-24 18:45:01

标签: servlets jetty sbt xsbt-web-plugin jetty-9

我在处理现有的Java项目时遇到了这个问题,我转换为使用SBT(之前完全基于Eclipse)。虽然Eclipse(仍在使用带有sbteclipse的Eclipse)报告org.my.FooServlet已映射到/FooServlet,但有一个servlet(比如org.my.FooServlet)无法通过Web浏览器访问

因此,为了排除可能源于将项目转换为使用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 个答案:

答案 0 :(得分:1)

对Jetty Annotations的支持是added in version 0.7.0。更新 plugins.sbt 中的xsbt-web-plugin,你应该很高兴:

项目/ 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/stackoverflow.com/questions/20179351/

答案 1 :(得分:0)

需要通过注释/类扫描找到@WebServlet调用。

Jetty的依赖项列表缺少注释扫描的整个功能集。

也添加这些。

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