Java 访问编译的jar/war文件之外的文件
我构建了一个SpringBoot应用程序,从网站api获取一些数据,并将响应保存为.json文件(以缓存数据,而不是在每次页面刷新时提取新内容) 然后,我将应用程序打包到一个.jar文件中。但当试图运行它时。每次尝试加载文件时,我都会得到java.io.FileNotFoundException。研究了一下,我需要将.json文件作为流获取。但我也希望在缓存超过5分钟时覆盖该文件。我们还尝试使用maven resources插件重新定位“目标”文件夹根目录下“json”文件夹中的json文件 所以我的问题是:如何从.jar文件所在的根文件夹中的JSON文件夹访问该文件?我尝试过使用“/JSON/file.JSON”和“.JSON/file.JSON”,但都会抛出FileNotFoundException异常Java 访问编译的jar/war文件之外的文件,java,spring-boot,Java,Spring Boot,我构建了一个SpringBoot应用程序,从网站api获取一些数据,并将响应保存为.json文件(以缓存数据,而不是在每次页面刷新时提取新内容) 然后,我将应用程序打包到一个.jar文件中。但当试图运行它时。每次尝试加载文件时,我都会得到java.io.FileNotFoundException。研究了一下,我需要将.json文件作为流获取。但我也希望在缓存超过5分钟时覆盖该文件。我们还尝试使用maven resources插件重新定位“目标”文件夹根目录下“json”文件夹中的json文件 所
编辑:您应该始终指定外部资源的绝对路径(类路径之外)。这是必要的,因为如果指定相对路径,应用程序将从类路径开始搜索,而不是从包含jar和json文件夹的文件夹开始搜索 您可以这样做:
new FileInputStream(new File("file://absolute_path/json/jsonfile.json"));
这方面的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);
你能给我们看看你的文件夹结构吗?(JAR在哪里,JSON在哪里,等等)尝试将编译好的.JAR和JSON文件夹复制到另一个目录,并在控制台上使用
java-JAR your_JAR_name.JAR
运行它,看看它是否有效。@Paschoal我已经尝试过了。我正在mac上使用终端命令运行.jar文件:java-jar tracker-0.0.1-SNAPSHOT.jar
@Bryde请避免发布文本图像,因为一些用户(包括我自己)可能无法查看它们。更喜欢纯文本。获取.jar文件的绝对路径的好方法是什么?正如我稍后将要将项目移动到服务器。然后路径就会改变。你应该将配置外部化。使用spring,您可以使用外部conf文件()。通过这种方式,您可以为每个安装编辑绝对路径。我的外部文件不是项目本身的配置文件。但是,即使尝试输入文件的绝对路径也不起作用。在尝试读取文件内容之前,我打印了路径,但仍然得到FileNotFoundException。但是如果我复制路径并将cat
放在路径前面。它会将文件内容打印到终端。您确定应用程序具有读取文件的正确权限吗?您可以尝试将775权限递归设置为json文件夹的临时权限。我的应用程序不是基于.jsp的。所以我甚至不能运行这个解决方案。悲哀地