0

我有一个使用 Spark 框架的 Java/Maven Web 应用程序,我正在尝试使用 Cargo 插件将其部署到远程 Tomcat 服务器。我从来没有使用 Java 做过这个,而且我很难处理静态文件。我的爆炸战争的目录结构是:

应用程序名称

-- 元信息

- 上市

---- 图像.jpg

---- html

------ 索引.html

-- 网络信息

当我使用以下代码时:

return "<html><body><img src='/app-name/public/image.jpg' /></body></html>";

我能够很好地渲染图像。我还可以通过访问 domain.com:8080/app-name/public/image.jpg 和 domain.com:8080/app-name/public/html/Index.html 来访问图像和 html 文件但是,当我尝试使用...呈现html

// location of the file on the server...
file = "/app-name/public/html" + file;
// location of the file on localhost
//file = "public/html/" + file;
BufferedReader buffer = new BufferedReader(new FileReader(file));

我遇到了 FileNotFoundException。它在 localhost 上运行良好(渲染功能也可以)。我只是在远程服务器上找不到 Index.html 文件。

对于那些熟悉Spark的人来说,你知道那里并没有太多的例子。我一边走一边编,我希望通过展示我走在正确轨道上的形象来做到这一点。有人有什么建议吗?我怀疑这一定是一个类路径问题,但我现在对此感到困惑。我只展示了最相关的片段;如果需要,我可以发布更多!

编辑:例外是:

java.io.FileNotFoundException: /app-name/public/html/Index.html (No such file or directory)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at java.io.FileInputStream.<init>(FileInputStream.java:97)
    at java.io.FileReader.<init>(FileReader.java:58)
    at com.render.Render.parseFile(Render.java:35)
    at com.render.Render.render(Render.java:23)
    at com.main.Main$1.handle(Main.java:41)
    at spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:136)
    at spark.servlet.SparkFilter.doFilter(SparkFilter.java:98)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Thread.java:722)
4

1 回答 1

1

首先,您不能依赖相对路径。您不知道您正在执行的 JVM 选择设置当前工作目录的位置。

此外,servlet 规范不允许您直接访问文件,并且您不能依赖于战争的爆发。这些资源的自然位置是在 Classpath 上并作为资源读取。

于 2013-04-23T20:24:37.030 回答