如何使用嵌入式Jetty设置静态资源和自定义服务?

Col*_*lin 7 java jetty embedded-jetty

我试图通过嵌入Jetty为我的应用程序设置一个简单的Web服务.我想提供两种不同的Web服务,一种简单的HTTP服务器,它只提供静态内容(最终将是一个GWT应用程序)和一个可以为应用程序吐出JSON状态消息的自定义servlet.

我的分发文件夹结构如下所示:

+ dist/
  - MyApp.jar
  + lib/
  + html/
    - index.html
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止配置嵌入式服务器的方法.我在访问时正确地从我的自定义servlet获取测试输出http://localhost/data/,但我似乎无法让DefaultServlet找到我的index.html文件.

public Webserver(int port) {
    server = new Server(port);

    ServletContextHandler context = new ServletContextHandler();
    context.setResourceBase("./html/");
    server.setHandler(context);


    JsonDataApiServlet dataServlet = new JsonDataApiServlet();
    DefaultServlet staticServlet = new DefaultServlet();

    context.addServlet(new ServletHolder(dataServlet), "/data/*");
    context.addServlet(new ServletHolder(staticServlet), "/*");
}
Run Code Online (Sandbox Code Playgroud)

对于将Jetty嵌入到东西中的人来说,这似乎是一项普遍的任务.我是否在正确的轨道上?

编辑

原来这个问题是由于误解了Jetty内部相对路径的计算方式.我是从dist文件夹上方的一个文件夹中运行它,使用java -jar dist\MyApp.jar,而Jetty正在寻找dist\..\html而不是正确的dist\html.从dist文件夹内运行jar可以解决问题.我将回答我是如何工作的,而不必从dist目录中运行.

Col*_*lin 6

正如编辑所说,这只是我运行jar的目录的一个问题.这是我用来从Jar运行的任何地方找到html文件夹的方法:

首先,我将html文件夹添加到Jar的Manifest Class-Path中.以下代码为加载Jar的地方提供了html文件夹:

ClassLoader loader = this.getClass().getClassLoader();
File indexLoc = new File(loader.getResource("index.html").getFile());
String htmlLoc = indexLoc.getParentFile().getAbsolutePath();
Run Code Online (Sandbox Code Playgroud)

这使用Classloader在类路径中查找索引文件,然后找到要传递给Jetty的绝对目录:

server = new Server(port);

ServletContextHandler context = new ServletContextHandler();
context.setResourceBase(htmlLoc);
context.setWelcomeFiles(new String[] { "index.html" });
server.setHandler(context);


JsonDataApiServlet dataServlet = new JsonDataApiServlet();
DefaultServlet staticServlet = new DefaultServlet();

context.addServlet(new ServletHolder(dataServlet), "/data/*");
context.addServlet(new ServletHolder(staticServlet), "/*");
Run Code Online (Sandbox Code Playgroud)