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

时间:2012-02-21 21:27:44

标签: java jetty embedded-jetty

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

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

+ dist/
  - MyApp.jar
  + lib/
  + html/
    - index.html

以下是我到目前为止配置嵌入式服务器的内容。我在访问http://localhost/data/时正确地从我的自定义servlet获取测试输出,但我似乎无法让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), "/*");
}

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

修改

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

1 个答案:

答案 0 :(得分: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();

这使用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), "/*");