gpt4 book ai didi

java - 项目根目录下的文件不包含在 war 中

转载 作者:太空宇宙 更新时间:2023-11-04 10:47:56 27 4
gpt4 key购买 nike

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

问题:

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

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)

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

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)

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

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

最佳答案

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

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

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

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

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

关于java - 项目根目录下的文件不包含在 war 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48186867/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com