Embedded Jetty找不到带注释Servlet



缩写:我有一个项目提供了一个war工件,其中包括一个带有注释但没有web.xml的servlet。如果我尝试在jetty中使用war,我总是只得到war内容的目录列表,而没有servlet执行。

知道吗?

长话短说:我的servlet看起来像这个

package swa;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet( asyncSupported = false, urlPatterns={"/*"})
public class ServletX extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // Set response content type
        response.setContentType("text/html");
        // Actual logic goes here.
        PrintWriter out = response.getWriter();
        out.println("<h1>Hi there..</h1>");
    }
}

所以我想没什么特别的。当我使用mvn jetty:run时,一切都很好。在确保这一点之后,该项目被打包到战争档案中。

这个战争档案在另一个项目中使用,该项目必须在代码中设置码头。这就是它的做法:

        String jettyPort = properties.getProperty("jetty.port", "8080");
        Server server = new Server();
        ServerConnector httpConnector = new ServerConnector(server, new HttpConnectionFactory());
        httpConnector.setPort(Integer.parseInt(jettyPort));
        httpConnector.setAcceptQueueSize(2);
        httpConnector.setHost("0.0.0.0");
        httpConnector.setIdleTimeout(30000);
        server.setConnectors(new Connector[] { httpConnector });
        WebAppContext wacHandler = new WebAppContext();
        wacHandler.setContextPath("/admin");
        wacHandler.setWar("swa-0.0.1-SNAPSHOT.war");
        wacHandler.setConfigurationDiscovered(true);
        server.setHandler(wacHandler);
        server.start();

在执行这个项目时,日志告诉我战争已经结束。但如果我打开url http://localhost:8080/admin,我只看到战争内容的列表(而不是"你好")。

有人能指出我的失败吗?

更新-2021年8月

从码头10.0.0(包括码头11.0.0)开始,该过程发生了变化

类路径上jetty-annotations-<ver>.jar的存在足以为servlet和websocket层启用注释和字节码扫描。

不应再使用WebAppContext.setConfiguration(...)方法。

旧的示例项目已存档并替换为

https://github.com/jetty-project/embedded-servlet-server

有一些例子。。。

Servlet API版本 Jetty版本 新建分支
3.1 码头9.4.x 嵌入式servlet服务器:jetty-9.4.x
4.0 码头10.x 嵌入式servlet服务器:jetty-10.0.x
5.0 11.x码头 嵌入式servlet服务器:jetty-11.0.x

除了添加上述答案中所述的必要配置外,还需要强制Jetty扫描当前项目编译的类,Jetty默认忽略这些类。要做到这一点,只需在WebAppContext上调用以下命令:

context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", ".*/classes/.*")

请在此处(Kotlin)查看完整的示例:https://github.com/mvysny/vaadin-on-kotlin/blob/master/vok-example-crud/src/test/java/com/github/vok/example/crud/Server.kt

这非常棒,可以发现所有@WebServlets、@WebListeners和其他内容。

最新更新