我一直在搜索如何使嵌入式jetty服务器提供同一个jar中包含的少量html文件而没有成功。当然这有可能吗?
如果我不需要,我真的不想经历建设和战争的麻烦。理想情况下,我不必创建WEB-INFO目录和web.xml文件,尽管我读过的所有解决方案似乎都指向这样做并使用WebAppContext。
我已经阅读了以下链接,但是从jar运行时没有找到设置ResourceBase或BaseResource属性的方法。
Start java application with jetty without WAR file
What is correct URL to specify ResourceBase of JAR "resources/webapp" folder for embedded Jetty?
Embedded Jetty looking for files inside its Jar file
在DEV期间通过IDE运行它很简单,代码工作并且看起来像这样..
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(httpPort);
server.addConnector(connector);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
context.setWelcomeFiles(new String[]{"welcome.html"});
server.setHandler(context);
ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class);
holderPwd.setInitParameter("resourceBase","./Relative/Path/To/Html/Files");
holderPwd.setInitParameter("dirAllowed","true");
context.addServlet(holderPwd,"/");
server.start();
server.join();
那么,我是否必须使用WebAppContext而不是ServletContextHandler?如果是,那么我是否还必须添加webapp / WEB-INFO / web.xml目录结构?如果我这样做,那么我必须打包作为一场战争吗?
答案 0 :(得分:3)
您需要将Context的资源库设置为可以访问静态内容的URL / URI。
注意:您将此设置为ServletContext
级别,而不是DefaultServlet
级别,这样您上下文中的所有servlet都可以访问ServletContext
相关的相同信息和各种方法真正的文件路径和资源是理智的。
public static void main(String[] args) throws Exception
{
Server server = new Server(8080);
// Figure out what path to serve content from
ClassLoader cl = MyEmbeddedJettyMain.class.getClassLoader();
// We look for a file, as ClassLoader.getResource() is not
// designed to look for directories (we resolve the directory later)
URL f = cl.getResource("static-root/hello.html");
if (f == null)
{
throw new RuntimeException("Unable to find resource directory");
}
// Resolve file to directory
URI webRootUri = f.toURI().resolve("./").normalize();
System.err.println("WebRoot is " + webRootUri);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
context.setBaseResource(Resource.newResource(webRootUri));
context.setWelcomeFiles(new String[]{"welcome.html"});
ServletHolder holderPwd = new ServletHolder("default", DefaultServlet.class);
holderPwd.setInitParameter("dirAllowed","true");
context.addServlet(holderPwd,"/");
server.setHandler(context);
server.start();
server.join();
}