Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring/Maven从类路径加载文件_Java_Spring_Maven_Spring Boot - Fatal编程技术网

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/