gpt4 book ai didi

java - 多项目 gradle 构建中的 Jetty ResourceHandler 看起来在错误的目录中

转载 作者:行者123 更新时间:2023-12-01 11:22:19 24 4
gpt4 key购买 nike

我使用 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();
}
}

最佳答案

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

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

尝试通过 ClassPath 查找 ResourceBase 中已知的资源,然后使用 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,它更适合提供静态文件)

关于java - 多项目 gradle 构建中的 Jetty ResourceHandler 看起来在错误的目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31080315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com