【问题标题】:Accessing files outside of compiled jar/war file访问已编译的 jar/war 文件之外的文件
【发布时间】:2019-11-06 14:08:46
【问题描述】:

我构建了一个 Spring Boot 应用程序,它从网站 api 获取一些数据,并将响应保存为 .json 文件(以缓存数据,而不是在每次页面刷新时拉取新内容)

然后我将应用程序打包到一个 .jar 文件中。但是当试图运行它时。每次尝试加载文件时,我都会得到 java.io.FileNotFoundException。研究了一下,我需要将 .json 文件作为流获取。但是当缓存超过 5 分钟时,我也想覆盖该文件。还尝试使用 maven-resources-plugin 将 json 文件重新定位在“target”文件夹根目录下的“JSON”文件夹中。

所以我的问题是:如何从 .jar 文件所在的根文件夹中的 JSON 文件夹访问该文件?我尝试过使用“./JSON/file.json”和“.JSON/file.json”,但都抛出 FileNotFoundException 异常。

编辑:added file structure of compiled project.

【问题讨论】:

  • 你能告诉我们你的文件夹结构吗? (JAR 在哪里,JSON 在哪里等等..)
  • 尝试将编译好的 .jar 和 JSON 文件夹复制到另一个目录并在控制台上使用java -jar your_jar_name.jar 运行它,看看它是否有效。
  • @Paschoal 我已经尝试过了。我正在使用终端命令在我的 Mac 上运行 .jar 文件:java -jar tracker-0.0.1-SNAPSHOT.jar
  • @Bryde 请避免发布文本图像,因为某些用户(包括我自己)可能无法查看它们。首选纯文本。

标签: java spring-boot


【解决方案1】:

您应该始终指定外部资源的绝对路径(在类路径之外)。这是必要的,因为如果您指定相对路径,应用程序将从类路径开始搜索,而不是从包含 jar 和 json 文件夹的文件夹开始搜索。

你可以这样做:

new FileInputStream(new File("file://absolute_path/json/jsonfile.json"));

【讨论】:

  • 获取 .jar 文件的 absolute_path 的好方法是什么?因为我稍后会将项目移动到服务器。然后路径就会改变。
  • 你应该外部化配置。使用 spring,您可以使用外部 conf 文件(look here)。这样每次安装都可以编辑绝对路径。
  • 我的外部文件不是项目本身的配置文件。但即使尝试输入文件的绝对路径也不起作用。我在尝试读取文件内容之前打印出路径,但仍然得到 FileNotFoundException。但是如果我复制路径并将cat 放在路径前面。它确实将文件内容打印到终端
  • 您确定应用程序具有读取文件的正确权限吗?您可以尝试临时将 775 权限递归设置为 json 文件夹。
【解决方案2】:

为此的maven结构是src/main/webapp/,会有一个非公开的WEB-INF/,这是个性化json的好地方:WEB-INF/JSON/(区分大小写)。

要获取 webapp 的物理根目录,可以使用 servlet 上下文或 jsf 上下文。 ServletContext.getRealPath("/WEB-INF/JSON")。可能将战争部署为“爆炸式”。

或者,您可以使用 Spring 中允许的外部配置。

默认,模板文件,可以作为资源存储,复制到文件系统中。

URL url = getClass().getResource("/data/JSON/new.json");
Path path = Paths.get(url.toURI());
Path path2 = Paths.get(request.getServletContext().getRealPath("/WEB-INF/JSON/untitled.json"));
Files.copy(path, paths2);

【讨论】:

  • 我的应用程序不是基于 .jsp 的。所以我什至无法让这个解决方案运行。可惜
猜你喜欢
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
相关资源
最近更新 更多