我在表格中使用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();
}
}
答案 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
开始查看。