在 Jetty 中部署简单的 Web 应用程序时遇到问题

Having trouble deploying simple web app in Jetty

我正在使用 Jetty 编写一个简单的服务器。

SimpleServer.java:

public class SimpleServer {

    public static void main(String[] args) throws Exception {
        Server server = new Server(8080);
        server.setHandler(new ServerHandler());
        server.start();
        server.join();
    }   

}

ServerHandler.java:

public class ServerHandler extends AbstractHandler {

    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

        response.setContentType("text/html; charset=utf-8");
        response.setStatus(HttpServletResponse.SC_OK);
        baseRequest.setHandled(true);
        response.getWriter().println("<h1>Hello World</h1>");
    }
}

我用maven把文件打包成一个war文件,然后放到jetty/webapps目录下。我有一个名为 root.war 的 war 文件,这意味着上下文位于 localhost:8080/。但是当我访问它时,在浏览器中出现以下错误:

HTTP ERROR 503

Problem accessing /. Reason:

    Service Unavailable

在控制台中,我得到一个 java.lang.reflect.InvocationTargetException。该项目在 IntelliJ 中运行。只有当我把它放在 jetty/webapps 文件夹中时,我才会出错。

您的示例代码库是使用 Jetty Handler API.

编写的

WAR 文件需要 Servlet API,而不是 Jetty 处理程序 API。

如果您想继续使用 Jetty Handler API,那么您将继续使用 embedded-jetty 并在没有 WAR 文件的情况下完成所有操作。

如果你想要一个 WAR 文件,那么你将不得不不使用 Jetty Handler API.

将您的代码迁移到使用 Servlet API,并在您的 Web 描述符 (WEB-INF/web.xml) 中添加对它的引用。这将生成一个可以部署的正确 WAR 文件。

public class ServerServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    {
        response.setContentType("text/html; charset=utf-8");
        response.setStatus(HttpServletResponse.SC_OK);
        response.getWriter().println("<h1>Hello World</h1>");
    }
}

注意:您可以选择使用 Servlet API Annotations 而不是 WEB-INF/web.xml,但要知道您需要将 ${jetty.base} 实例目录配置为具有 annotations 模块已启用。