我使用的是Spring Boot和json-schema-validator
。我正在尝试从resources
文件夹中读取名为jsonschema.json
的文件。我试了几种不同的方法,但都不能奏效。这是我的密码。
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);
这是文件的位置。
在这里我可以看到classes
文件夹中的文件。
但是当我运行代码时,我得到以下错误。
jsonSchemaValidator error: java.io.FileNotFoundException: /home/user/Dev/Java/Java%20Programs/SystemRoutines/target/classes/jsonschema.json (No such file or directory)
我在代码中做错了什么?
15条答案
按热度按时间ejk8hzay1#
在花了很多时间试图解决这个问题后,终于找到了一个可行的解决方案。该解决方案利用了Spring的ResourceUtils。应该也适用于json文件。
感谢Lokesh Gupta撰写的精彩页面:Blog
回答人们对这些评论的一些担忧:
我非常确定我使用
java -jar target/image-service-slave-1.0-SNAPSHOT.jar
在Amazon EC2上运行了这个程序查看我的GitHub repo:https://github.com/johnsanthosh/image-service,找出从JAR运行它的正确方式。
abithluo2#
非常简短的回答:您要在类加载器的类的作用域中查找资源,而不是在目标类中。这应该是可行的:
此外,这可能是有帮助的读物:
另外,有这样一种情况:一个项目在一台机器上编译,然后在另一台机器上启动,或者在Docker内部启动。在这种情况下,您的资源文件夹的路径将无效,您需要在运行时获取它:
最重要的是,如果您希望将资源文件作为字符串读取,例如在测试中,您可以使用这些静态utils方法:
用法示例:
rslzwgfq3#
例如,如果您在Resources文件夹下有配置文件夹,我尝试了这个类,希望对您有帮助
k75qkfdt4#
花了太多时间回到这一页,所以就把这个留在这里:
pqwbnv8z5#
2021最好的方式
读取文件的最简单方法是:
t5zmwmid6#
点击此处查看我的答案:https://stackoverflow.com/a/56854431/4453282
使用这两个导入。
申报
在某些函数中使用它
在您的情况下,因为您需要文件,所以可以使用以下文件
File file = resource.getFile()
参考:http://frugalisminds.com/spring/load-file-classpath-spring-boot/在前面的回答中已经提到,不要使用资源实用程序它在JAR部署后不工作,这将在IDE中工作,也可以在部署后工作
up9lanfz7#
以下是我的工作代码。
希望这对一个人有帮助!
t9aqgxwy8#
如何可靠获取资源
要可靠地从Spring Boot应用程序的资源中获取文件,请执行以下操作:
1.找到传递抽象资源的方法,例如
InputStream
、URL
而不是File
1.使用框架工具获取资源
示例:从
resources
读取文件ClassPathResource
是Spring对Resource
的实现,Resource
是加载资源*的抽象方式。它是使用ClassPathResource(String, Class<?>)
构造函数示例化的:/hello
是文件的路径前导斜杠按类路径中的绝对路径加载文件
它是必需的,因为否则路径将是相对于类的
如果传递
ClassLoader
而不是Class
,则可以省略斜杠另见What is the difference between Class.getResource() and ClassLoader.getResource()?
第二个参数是要加载资源的
Class
更喜欢传递
Class
而不是ClassLoader
,因为ClassLoader.getResource
differs fromClass.getResource
in JPMS项目结构:
上面的示例可以在IDE和JAR中使用
更深层次解释
优先选择抽象资源,而不是
File
抽象资源的示例为
InputStream
和URL
避免使用
File
,因为并不总是可以从类路径资源中获取它例如,以下代码可以在IDE中运行:
,但在运行Spring Boot JAR时失败,错误为:
如果您使用外部库,并且它要求您提供资源,请尝试找到一种方法将
InputStream
或URL
传递给它例如,问题中的
JsonLoader.fromFile
可以替换为JsonLoader.fromURL
方法:它接受URL
使用框架的功能获取资源:
Spring框架支持通过
ClassPathResource
访问类路径资源您可以使用它:
1.直接,如从
resources
读取文件的示例1.使用
@Value
:ResourceLoader
:9jyewag09#
在资源中创建json文件夹作为子文件夹,然后在文件夹中添加json文件,然后可以使用代码:
import com.fasterxml.jackson.core.type.TypeReference;
InputStream is = TypeReference.class.getResourceAsStream("/json/fcmgoogletoken.json");
这在Docker中有效。
niknxzdl10#
以下是我的解决方案。可能会帮助某些人;
它返回InputStream,但我假设您也可以从中读取。
nsc4cvqm11#
陷入同样的问题,这对我有帮助
afdcj2ne12#
将RESOURCES目录中的类路径中的资源解析为字符串的最简单方法是以下一行。
作为字符串(使用Spring库):
此方法使用StreamUtils实用程序,并以简洁紧凑的方式将文件作为输入流传输到字符串中。
如果希望将文件作为字节数组,则可以使用基本的Java文件I/O库:
作为字节数组(使用Java库):
sqyvllje13#
如果您使用的是
spring
和jackson
(大多数较大的应用程序都会使用),则使用简单的内联:JsonNode json = new ObjectMapper().readTree(new ClassPathResource("filename").getFile());
7vux5j2d14#
Spring提供了可用于加载文件的
ResourceLoader
。已参考此link。
eivnm1vs15#
对我来说,这个错误有两个修复方法。
1.名为SAMPLE.XML的XML文件,该文件在部署到AWS EC2时甚至会导致以下解决方案失败。修复方法是将其重命名为new_sample.xml并应用下面给出的解决方案。
1.解决方案https://medium.com/@jonathan.henrique.smtp/reading-files-in-resource-path-from-jar-artifact-459ce00d2130
我使用Spring Boot作为JAR并部署到AWS EC2 Java版本的解决方案如下: