【问题标题】:Unable to get servlet to be hooked in with @WebServlet annotation in an SBT project using Jetty 9在使用 Jetty 9 的 SBT 项目中,无法使用 @WebServlet 注释连接 servlet
【发布时间】:2013-12-09 08:51:38
【问题描述】:

我在处理已转换为使用 SBT(之前纯粹基于 Eclipse)的现有 Java 项目时遇到了这个问题。尽管 Eclipse(仍在使用 Eclipse 和 sbteclipse)报告 /FooServlet 已映射到 org.my.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 无济于事。

【问题讨论】:

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


    【解决方案1】:

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

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

    也添加这些。

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

    【讨论】:

    • 实际上我正要编辑我的问题并修改这些——我在libraryDependencies 中有它们,但仍然没有;我还尝试添加带有org.eclipse.jetty.webapp.WebAppContext.setConfigurationClasses 设置的jetty-web.xml 以包含org.eclipse.jetty.annotations.AnnotationConfiguration,但这实际上会导致java.lang.reflect.InvocationTargetException in file:/.../WEB-INF/jetty-web.xml,我无法确定原因。
    • embedded-servlet-3.0 的示例可能会有所帮助,尤其是 Configurations List
    • 是的,但请参阅我的另一个问题:stackoverflow.com/questions/20192300/… — 似乎无法通过jetty-web.xmlAnnotationConfiguration 添加到WebAppContext.configurationClasses
    • 不,添加它们为时已晚。这些是服务器端。将在其他问题中回答。
    【解决方案2】:

    对 Jetty 注释的支持是 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/

    【讨论】:

    • 我认为我是报告它的人(或者至少我记得参加过 cmets),所以我已经知道这很有效!但是现在可以在 Stack Overflow 上使用它真是太好了!
    猜你喜欢
    • 2021-03-15
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    相关资源
    最近更新 更多