首页 文章

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

提问于
浏览
0

我一直在搜索如何使嵌入式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 回答

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

相关问题