[英]Deploying Jetty server via .jar. Why can't I access the index?
I'm trying to deploy a Jetty server from a jar file.我正在尝试从 jar 文件部署 Jetty 服务器。 When jar is being run on the server, it reaches the Jetty 404 page at least, but is unable to reach
index.html
. jar 在服务器上运行时,它至少会到达 Jetty 404 页面,但无法到达
index.html
。
My main class to launch the server looks like this, and works fine locally when run through the IDE on localhost:我用于启动服务器的主类如下所示,并且在本地主机上通过 IDE 运行时在本地运行良好:
public static void main(String[] args) {
Server server = new Server(8080);
ServletContextHandler servletContextHandler = new ServletContextHandler(NO_SESSIONS);
servletContextHandler.setContextPath("/");
DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
final URL htmlDirectory = JerseyApplication.class.getResource("/html");
holderPwd.setInitParameter("resourceBase", htmlDirectory.getFile());
servletContextHandler.addServlet(holderPwd, "/*");
server.setHandler(servletContextHandler);
ServletHolder servletHolder = servletContextHandler.addServlet(ServletContainer.class, "/api/*");
servletHolder.setInitOrder(0);
servletHolder.setInitParameter(
"jersey.config.server.provider.packages",
"com.x.y.z.parser");
try {
LOGGER.info("Starting server");
server.start();
server.join();
}
catch (Exception ex) {
LOGGER.error("Server failed to start - Aborting");
ex.printStackTrace();
}
finally {
LOGGER.info("Destroying server");
server.destroy();
}
}
All html stuff is in a the src/main/resources/html
directory.所有 html 内容都在
src/main/resources/html
目录中。
When I run jar tvf jarfile.jar | grep html
当我运行
jar tvf jarfile.jar | grep html
jar tvf jarfile.jar | grep html
I can see the html
directory and it's contents are in there: jar tvf jarfile.jar | grep html
我可以看到html
目录,它的内容在那里:
0 Thu Nov 01 11:48:46 UTC 2018 html/
2258 Thu Nov 01 11:48:46 UTC 2018 html/formRequest.js
871 Thu Nov 01 11:48:46 UTC 2018 html/index.html
Thanks!谢谢!
Use the URL you got from htmlDirectory
as the Base Resource for the entire ServletContextHandler
.使用从
htmlDirectory
获得的 URL 作为整个ServletContextHandler
的基本资源。
See prior answer for details: https://stackoverflow.com/a/39019797/775715有关详细信息,请参阅先前的答案: https : //stackoverflow.com/a/39019797/775715
final URL htmlDirectory = JerseyApplication.class.getResource("/html");
// TODO: Handle error if htmlDirectory == null
ServletContextHandler servletContextHandler = new ServletContextHandler(NO_SESSIONS);
servletContextHandler.setContextPath("/");
servletContextHandler.setBaseResource(Resource.newResource(htmlDirectory));
DefaultServlet defaultServlet = new DefaultServlet();
ServletHolder holderPwd = new ServletHolder("default", defaultServlet);
// holderPwd.setInitParameter("resourceBase", htmlDirectory.getFile()); <-- not needed here
servletContextHandler.addServlet(holderPwd, "/"); // NOTE: MUST be "/" not "/*"!
One last thing, you seem to be using Jersey.最后一件事,您似乎在使用 Jersey。 (aka
jersey.config.server.provider.packages
) Make sure you DISABLE the Jersey configurations that make Jersey serve static content itself. (又名
jersey.config.server.provider.packages
)确保禁用使 Jersey 本身提供静态内容的 Jersey 配置。 Let Jetty be responsible.让码头负责。 (as to how this is done, that's another question, which is Jersey version specific and has answers already on stackoverflow)
(至于这是如何完成的,这是另一个问题,这是特定于 Jersey 版本的,并且已经在 stackoverflow 上提供了答案)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.