我正在尝试通过嵌入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目录中运行。
答案 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), "/*");