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目录中运行.
正如编辑所说,这只是我运行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)
| 归档时间: |
|
| 查看次数: |
5976 次 |
| 最近记录: |