SparkJava的:index.hbs FileNotFoundException

时间:2018-09-22 18:09:14

标签: java spark-java

我用SparkJava框架开发了一个Web应用程序。当我从Eclipse运行该应用程序时,它运行良好。当我将其打包到jar文件中时,运行jar文件并在浏览器中打开Web应用程序,我会收到500内部错误。

控制台返回FileNotFoundException。 hbs文件位于src / main / resources / templates中。

org.eclipse.jetty.io.RuntimeIOException: java.io.FileNotFoundException: /templates/index.hbs
    at spark.template.handlebars.HandlebarsTemplateEngine.render(HandlebarsTemplateEngine.java:78) ~[jar:rsrc:spark-template-handlebars-2.7.1.jar!/:?]
    at App.lambda$0(App.java:42) ~[rsrc:./:?]
    at spark.SparkBase$1.handle(SparkBase.java:264) ~[jar:rsrc:spark-core-2.1.jar!/:?]
    at spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:154) [jar:rsrc:spark-core-2.1.jar!/:?]
    at spark.webserver.JettyHandler.doHandle(JettyHandler.java:60) [jar:rsrc:spark-core-2.1.jar!/:?]
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:179) [jar:rsrc:jetty-server-9.0.2.v20130417.jar!/:?]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:136) [jar:rsrc:jetty-server-9.0.2.v20130417.jar!/:?]
    at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52) [jar:rsrc:jetty-server-9.0.2.v20130417.jar!/:?]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jar:rsrc:jetty-server-9.0.2.v20130417.jar!/:?]
    at org.eclipse.jetty.server.Server.handle(Server.java:451) [jar:rsrc:jetty-server-9.0.2.v20130417.jar!/:?]
    at org.eclipse.jetty.server.HttpChannel.run(HttpChannel.java:252) [jar:rsrc:jetty-server-9.0.2.v20130417.jar!/:?]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:266) [jar:rsrc:jetty-server-9.0.2.v20130417.jar!/:?]
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.run(AbstractConnection.java:240) [jar:rsrc:jetty-io-9.0.2.v20130417.jar!/:?]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:596) [jar:rsrc:jetty-util-9.0.2.v20130417.jar!/:?]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:527) [jar:rsrc:jetty-util-9.0.2.v20130417.jar!/:?]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
Caused by: java.io.FileNotFoundException: /templates/index.hbs
    at com.github.jknack.handlebars.io.URLTemplateLoader.sourceAt(URLTemplateLoader.java:70) ~[jar:rsrc:handlebars-4.0.6.jar!/:?]
    at com.github.jknack.handlebars.Handlebars.compile(Handlebars.java:357) ~[jar:rsrc:handlebars-4.0.6.jar!/:?]
    at com.github.jknack.handlebars.Handlebars.compile(Handlebars.java:343) ~[jar:rsrc:handlebars-4.0.6.jar!/:?]
    at spark.template.handlebars.HandlebarsTemplateEngine.render(HandlebarsTemplateEngine.java:75) ~[jar:rsrc:spark-template-handlebars-2.7.1.jar!/:?]

我不明白的是,为什么当我在Eclipse中运行它但不能将其包装到罐子中时,它为什么能工作?

知道可能是什么问题吗?

2 个答案:

答案 0 :(得分:1)

URLTemplateLoader.sourceAt()抛出此错误,因为getResource()返回null,这是代码:

  protected URL getResource(final String location) throws IOException {
    File file = new File(location);
    return file.exists() ? file.toURI().toURL() : null;
  }

您将相对路径传递给File构造函数,并且从工作目录中解决了该问题。

  

路径名,无论是抽象的还是字符串形式的,都可以是绝对的或相对的。绝对路径名是完整的,因为不需要其他信息即可找到它表示的文件。相反,相对路径名必须根据从其他路径名获取的信息来解释。默认情况下,java.io包中的类始终针对当前用户目录解析相对路径名。该目录由系统属性user.dir命名,通常是在其中调用Java虚拟机的目录。

File javadoc

答案 1 :(得分:0)

我自己解决了这个问题。问题出在Eclipse。由于它可能对遇到相同问题的其他人有用,所以我自己创建答案。

该问题是由以下事实引起的:/ src / main / resource文件夹已包含在Java构建路径中,但是由于某种原因,并未包含所有子文件夹。值“ **”已分配给“ 已排除:”项。将值更改为“(无)”后,找到了模板文件。

Solution is to assign value (None) to *Excluded* item