无法使用嵌入式Jetty访问JAR文件中的静态资源

无法使用嵌入式Jetty访问JAR文件中的静态资源,jar,jetty,embedded-jetty,Jar,Jetty,Embedded Jetty,我的问题基本上与这个问题相同: 我使用的是嵌入式Jetty,我想访问同一JAR文件中的一些静态HTML文件 以下是Jetty服务器的设置方式: ServletContextHandler上下文=新的ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath(“/”); 字符串res=ApiServer.class.getClassLoader().getResource(“res”).toExte

我的问题基本上与这个问题相同:

我使用的是嵌入式Jetty,我想访问同一JAR文件中的一些静态HTML文件

以下是Jetty服务器的设置方式:


ServletContextHandler上下文=新的ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath(“/”);
字符串res=ApiServer.class.getClassLoader().getResource(“res”).toExternalForm();
setResourceBase(res);
jettyServer=新服务器(端口);
setHandler(上下文);
ServletHolder jerseyServlet=context.addServlet(ServletContainer.class,“/*”);
jerseyServlet.setInitOrder(0);
//告诉Jersey Servlet要加载哪个REST服务/类。
字符串类=新的StringJoiner(“,”)
.add(MyClass1.class.getCanonicalName())
.add(MyClass2.class.getCanonicalName())
.toString();
setInitParameter(ServerProperties.PROVIDER_类名称、类);
JAR的文件夹结构如下所示:

root
  |  src (Java classes in here)
  |  res
      |  index.html
然而,它就是不起作用。我已尝试以各种方式访问URL:

http://localhost:12345/res/index.html

但两者都不起作用

我做错了什么?

您的代码

String res=ApiServer.class.getClassLoader().getResource(“res”).toExternalForm();
setResourceBase(res);
不适用于我,因为您不能使用类加载器获取目录引用,只能获取文件引用。调用
ClassLoader.getResource(“res”)
总是返回null

这需要先解决

其次,你对泽西岛的声明是非常贪婪的

ServletHolder-jerseyServlet=context.addServlet(ServletContainer.class,“/*”);
jerseyServlet.setInitOrder(0);
这意味着Servlet(
ServletContainer.class
)正在处理所有请求的100%,甚至是静态内容的请求

基于您的url模式,Servlet不可能“不处理”静态请求并让Jetty服务于这些静态请求

放松这个url模式,比如说
/api/*
,然后你就更接近了

您需要的最后一件事是
DefaultServlet
(Servlet规范中的组件,以及提供静态文件的Jetty)

因此,您将得到以下代码

ServletContextHandler context=newservletcontexthandler(ServletContextHandler.SESSIONS);
context.setContextPath(“/”);
URL URL=ApiServer.class.getClassLoader().getResource(“res/index.html”);
如果(url==null)
抛出新的FileNotFoundException(“哎呀,找不到静态资源文件夹”);
URI webroot=url.toURI().resolve(“./”);
setBaseResource(Resource.newResource(webroot));
ServletHolder jerseyServlet=context.addServlet(ServletContainer.class,“/api/*”);
jerseyServlet.setInitOrder(0);
//告诉Jersey Servlet要加载哪个REST服务/类。
字符串类=新的StringJoiner(“,”)
.add(MyClass1.class.getCanonicalName())
.add(MyClass2.class.getCanonicalName())
.toString();
setInitParameter(ServerProperties.PROVIDER_类名称、类);
//始终命名为“默认”,始终位于最后,始终位于url模式“/”
ServletHolder defaultServ=新的ServletHolder(“default”,DefaultServlet.class);
defaultServ.setInitParameter(“dirAllowed”、“true”);
addServlet(defaultServ,“/”);
jettyServer=新服务器(端口);
setHandler(上下文);
http://localhost:12345/index.html