多项目gradle构建中的Jetty ResourceHandler查找错误的目录

时间:2015-06-26 18:57:18

标签: java jetty embedded-jetty

我在表格中使用Gradle进行多项目构建:

project1
--build.gradle
--settings.gradle
project2
--src
----main
------java
--------LocalJettyRunner.java
------webapp
--------static
----------index.html

当我运行LocalJettyRunner并加载localhost:8135时,当我期待ResourceHandler返回我的Index.html时,我得到404。我调试了ResourceHandler.handle(...)方法,它看起来在我的project1/static目录中看起来显然不存在。我做错了什么?

LocalJettyRunner

public class LocalJettyRunner {}

    public void start() throws Exception {
        log.info("Starting api");

        ResourceHandler webHandler = new ResourceHandler();
        webHandler.setDirectoriesListed(true);
        webHandler.setResourceBase("static/");
        webHandler.setWelcomeFiles(new String[]{"index.html"});

        HandlerCollection handlers = new HandlerCollection();
        handlers.addHandler(webHandler);

        Server server = new Server(8135);
        server.setHandler(handlers);
        server.start();
    }

    public static void main(String[] args) throws Exception {
        new LocalJettyRunner().start();
    }
}

2 个答案:

答案 0 :(得分:1)

ResourceBase是绝对路径的绝对路径和/或URL。

它没有绝对路径的情况是因为new File(String).toAbsolutePath()的工作原理。

尝试通过ClassPath查找资源库中已知的资源,然后使用URL引用设置绝对路径。

示例:

假设你有一个src/main/resources/webroot/,其中包含静态内容(例如index.html),那么你可以先解决它,然后将其传递给基础资源。

package jetty.resource;

import java.net.URI;
import java.net.URL;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.util.resource.Resource;

public class ResourceHandlerExample
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server(8080);

        // Figure out what path to serve content from
        ClassLoader cl = ResourceHandlerExample.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("webroot/index.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);

        ResourceHandler handler = new ResourceHandler();
        handler.setBaseResource(Resource.newResource(webRootUri));

        server.setHandler(handler);

        server.start();
        server.join();
    }
}

顺便提一下,你有一个src/main/webapp/,它倾向于为Maven指出一个合适的webapp / war文件。对于完整的Web应用程序,可能更容易跳过ResourceHandler并直接使用WebAppContext(它将所有内容连接起来,不使用 ResourceHandler,但相反DefaultServlet,这对于提供静态文件更好[/ p>]

答案 1 :(得分:0)

ResourceBase设置为"../project2/src/main/webapp/static"似乎可以解决问题,但我不确定处理程序为什么会在project1开始查看。