缩写:我有一个项目提供了一个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和其他内容。