Serving static files with embedded Jetty
embedded-jetty, java, jetty
Solution
Use a `ResourceHandler` instead of `ServletContextHandler`.
Problem
I'm trying to build a simple demo app with embedded Jetty that serves static files from a "html" directory that's a subdirectory of the current working directory. The idea is that the directory with the demo jar and content can be moved to a new location and still work. I've tried variations of the following, but I keep getting 404s. ``` ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); context.getInitParams().put( "org.eclipse.jetty.servlet.Default.resourceBase", "html"); context.addServlet(new ServletHolder(new DefaultServlet()), "/html"); Server jetty = new Server(8080); jetty.setHandler(context); jetty.start(); ``` Update: Here's a solution as documented in the Jetty tutorial. As mentioned in the correct answer, it uses a `ResourceHandler` instead of a `ServletContextHandler`: ``` Server server = new Server(); SelectChannelConnector connector = new SelectChannelConnector(); connector.setPort(8080); server.addConnector(connector); ResourceHandler resource_handler = new ResourceHandler(); resource_handler.setDirectoriesListed(true); resource_handler.setWelcomeFiles(new String[]{ "index.html" }); resource_handler.setResourceBase("."); HandlerList handlers = new HandlerList(); handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() }); server.setHandler(handlers); server.start(); server.join(); ```
Related problems
- What is correct URL to specify ResourceBase of JAR "resources/webapp" folder for embedded Jetty?
- What is difference between ServletContextHandler.setResourceBase and ResourceHandler.setResourceBase when using Jetty embedded container?
- Jetty: default servlet context path
- ResourceHandler stop hosting files with jetty 9 - 404 not found error (works fine with jetty 8)