Java Spring/Maven从类路径加载文件
在“我的资源”文件夹中:Java Spring/Maven从类路径加载文件,java,spring,maven,spring-boot,Java,Spring,Maven,Spring Boot,在“我的资源”文件夹中: src/main/resources 我有两个文件,application.properties文件和一个JSON文件app.schema.JSON 我有以下功能: private File loadSchema(String schemaName) throws JsonSchemaMissingException { ClassLoader classLoader = JsonSchemaValidator.class.getClassLoader
src/main/resources
我有两个文件,application.properties
文件和一个JSON文件app.schema.JSON
我有以下功能:
private File loadSchema(String schemaName) throws JsonSchemaMissingException {
ClassLoader classLoader = JsonSchemaValidator.class.getClassLoader();
File file = new File(Objects.requireNonNull(classLoader.getResource("app.schema.json")).getFile());
if (!file.exists()) {
log.LogErrorWithTransactionId("", "file does not exist " + file.getAbsolutePath());
throw new JsonSchemaMissingException("file does not exist");
}
return file;
}
如果我运行mvn-spring-boot:run
它会成功地找到文件。如果我跑步:
mvn包
java-jarapp.jar
空指针
,因为以下文件不存在:
/home/XXX/Docs/project/XXX/file:/home/ghovat/Docs/project/XXX/target/app.jar!/BOOT-INF/classes!/app.event.json
在我的pom.xml In build中,我添加了以下设置,也添加了以下设置:
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
src/main/resources
这两种方法都不管用。如果我运行mvn spring boot:run
但是如果我运行mvncleanpackagespringboot:repackage
和java-jartarget/app.jar
它也找不到文件
我检查了所有的文档,并尝试了几种不同的方式来加载文件,但无论哪种方式都找不到
如何使文件可用?您需要使用pom.xml的相对路径将
src/main/resources
目录包含到类路径中:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
src/main/resources
您可以阅读更多信息。您需要使用pom.xml的相对路径将
src/main/resources
目录包含到类路径中:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
src/main/resources
您可以阅读更多信息。请检查jar内部是否包含classes文件夹中提到的文件。您还可以尝试使用下面的代码从类路径加载文件
Thread.currentThread().getContextClassLoader().getResource(<file_name>)
Thread.currentThread().getContextClassLoader().getResource()
如果可能的话,将该文件保存在jar外部的某个文件夹位置,并在执行jar时将该位置设置为类路径。请检查jar内部是否包含classes文件夹中提到的文件。您还可以尝试使用下面的代码从类路径加载文件
Thread.currentThread().getContextClassLoader().getResource(<file_name>)
Thread.currentThread().getContextClassLoader().getResource()
如果可能的话,将该文件保存在jar之外的某个文件夹位置,并在执行jar时将该位置设置为类路径。正如Ropert Scholet提到的,我使用Inputstream来加载它,而不是将其作为文件加载。 我用下面的代码修复了它:
private Reader loadSchema(String schemaName) throws JsonSchemaMissingException {
ClassLoader classLoader = JsonSchemaValidator.class.getClassLoader();
InputStream fileStream = classLoader.getResourceAsStream(schemaName);
if (fileStream == null) {
log.LogErrorWithTransactionId("", "file does not exist ");
throw new JsonSchemaMissingException("file does not exist");
}
Reader reader = new InputStreamReader(fileStream, StandardCharsets.UTF_8);
return reader;
}
注意:由于我使用该文件来验证JSON模式,我需要将Inputstream转换为一个reader对象,正如Ropert Scholet提到的,我使用Inputstream来加载,而不是将其作为文件加载。 我用下面的代码修复了它:
private Reader loadSchema(String schemaName) throws JsonSchemaMissingException {
ClassLoader classLoader = JsonSchemaValidator.class.getClassLoader();
InputStream fileStream = classLoader.getResourceAsStream(schemaName);
if (fileStream == null) {
log.LogErrorWithTransactionId("", "file does not exist ");
throw new JsonSchemaMissingException("file does not exist");
}
Reader reader = new InputStreamReader(fileStream, StandardCharsets.UTF_8);
return reader;
}
注意:由于我使用该文件验证JSON模式,因此我需要将Inputstream转换为reader对象,谢谢您的回答。我尝试了绝对路径,也收到了同样的错误<代码>文件不存在/home/XXX/Dokumente/project/XXX/file:/home/XXX/Dokumente/project/XXX/target/app.jar/BOOT-INF/classes/app.event.json感谢您的回答。我尝试了绝对路径,也收到了同样的错误<代码>文件不存在/home/XXX/Dokumente/project/XXX/file:/home/XXX/Dokumente/project/XXX/target/app.jar/BOOT-INF/classes/app.event.json这里的问题是您的
app.event.json
无法作为文件访问,因为它位于app.jar文件中。您必须将其作为资源访问。您的代码不会显示加载模式的结果发生了什么,但它应该能够处理InputStream
。只要你坚持使用InputStream,你就应该很好。这里的问题是你的app.event.json
不能作为文件访问,因为它在app.jar文件中。您必须将其作为资源访问。您的代码不会显示加载模式的结果发生了什么,但它应该能够处理InputStream
。只要你坚持输入流,你应该是好的。谢谢你的回答。如果我运行mvn-spring-boot:run
jar中存在文件。如果我只是运行mvn包
和java-jar XXX.jar
它不存在:/home/XXX/Dokumente/project/XXX/target/classes/XXX.json
如果我打开jaar包,我会在BOOT-INF/classes/
中看到该文件,谢谢你的回答。如果我运行mvn-spring-boot:run
jar中存在文件。如果我只是运行mvn包
和java-jar XXX.jar
它就不存在了:/home/XXX/Dokumente/project/XXX/target/classes/XXX.json
如果我打开jaar包,我会在BOOT-INF/classes/