如何从Jar中获取嵌入式Jetty服务html文件,而不是战争

时间:2015-11-20 14:50:41

标签: java html jar jetty

我一直在搜索如何使嵌入式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目录结构?如果我这样做,那么我必须打包作为一场战争吗?

1 个答案:

答案 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();
}