嵌入式Jetty没有找到带注释的Servlet

简而言之:我有一个项目提供了一个包含带注释但没有web.xml的servlet的war artifact。 如果我尝试在码头使用战争,我总是只得到战争内容的目录列表,而不是servlet执行。

任何想法?

长话短说:我的servlets看起来像这样

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(); 

在执行这个项目时,日志告诉我发现了战争。 但是,如果我打开网址http://localhost:8080/admin我只看到战争内容(而不是'你好')的列表。

有人能指出我的失败吗?

您需要适当地定义WebAppContext配置(并按正确的顺序)。

  wacHandler.setConfigurations(new Configuration[] { new AnnotationConfiguration(), new WebInfConfiguration(), new WebXmlConfiguration(), new MetaInfConfiguration(), new FragmentConfiguration(), new EnvConfiguration(), new PlusConfiguration(), new JettyWebXmlConfiguration() }); 

不要忘记添加jetty-annotations.jar

这是从EmbedMe.java示例中使用嵌入式jetty的 Servlet 3.1中找到的

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

除了添加上述答案中所述的必要配置之外,还需要强制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和其他人。

Interesting Posts