【问题标题】:File at the root of project not included in war [duplicate]项目根目录中的文件不包含在战争中[重复]
【发布时间】:2018-01-10 11:50:40
【问题描述】:

我是 Java 部署的新手,现在使用 JSON 文件存储一些数据并使用 new FileReader(file name) 调用 JSON 并解析并进行进一步处理。

问题:

1) 如果我在 new FileReader(file name) 中仅提供文件名,则显示文件未找到

Object obj = parser.parse(new FileReader("file.json"));

JSONArray arr = (JSONArray)obj;

Iterator i = arr.iterator();

这是堆栈跟踪:

java.io.FileNotFoundException: file.json (The system cannot find the file specified)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(Unknown Source)
at java.base/java.io.FileInputStream.<init>(Unknown Source)
at java.base/java.io.FileInputStream.<init>(Unknown Source)
at java.base/java.io.FileReader.<init>(Unknown Source)
at com.login.servlet.CheckAvailability.doGet(CheckAvailability.java:48)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Unknown Source)

如果我提供绝对路径,它可以正常工作,但我想提供相对路径。这样我就不必在 localhost 和部署的服务器上不断更改路径。

2) 我正在本地工作并尝试在服务器上部署。为此,我制作了 .war 文件。并在部署时不显示那些 JSON 文件

以下是用于可视化的屏幕截图。

look out for the file.json file on local host

look at the deployed folder where there is no file.json file (after making war file)

我尝试查看问题,但找不到确切的解决方案或我能理解的解决方案。

考虑到我是新手,请解释一下。

【问题讨论】:

    标签: java servlets war


    【解决方案1】:

    在应用程序服务器上,默认路径是启动服务器的路径(即启动服务器时所在的文件夹)或 bin 文件夹。所以目录和文件应该在里面。检查您所在路径的一种快速方法是打印或记录f.getAbsolutePath() 的结果,这将告诉您服务器默认的文件夹。

    您通常打开文件(new File(...)),而不是作为资源打开,因此不使用资源路径或类路径。

    在处理应用程序服务器时,最好避免使用默认路径,因为它很容易更改。要么有一个系统属性或等效的定义文件将在哪里搜索,或者,如果您要与应用程序一起发送要读取的文件,请将其放在 WAR 中并将其作为资源打开:

    YourClass.class.getResourceAsStream("/...");
    

    YourClass.class.getResource("/...");
    

    【讨论】:

    • 谢谢大佬的回复,是jre版本不匹配的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-05-12
    • 2019-07-12
    • 1970-01-01
    • 2017-02-12
    • 2023-04-07
    • 1970-01-01
    • 2019-02-10
    • 2016-11-24
    相关资源
    最近更新 更多