猿问

Spring / Maven 从类路径加载文件

在我的资源文件夹中:


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 package

java -jar app.jar

我得到一个NullPointer,因为以下文件不存在:


/home/XXX/Docs/project/XXX/file:/home/ghovat/Docs/project/XXX/target/app.jar!/BOOT-INF/classes!/app.event.json

在构建中的 pom.xml 中,我添加了以下设置:


<resources>

            <resource>

                <directory>src/main/resources</directory>

            </resource>

        </resources>

无论哪种方式都行不通。如果我运行,它可以到达该文件mvn spring-boot:run ,但如果我运行mvn clean package spring-boot:repackage但java -jar target/app.jar找不到该文件,它也可以到达该文件。


我检查了所有文档并尝试了几种不同的方法来加载文件,但无论哪种方式都找不到它。


我怎样才能使该文件可用?


萧十郎
浏览 94回答 3
3回答

元芳怎么了

您能否检查一下 jar 内是否包含类文件夹中提到的文件。您也可以尝试下面的代码从类路径加载文件。Thread.currentThread().getContextClassLoader().getResource(<file_name>)如果可能,则将该文件保留在 jar 外部的某个文件夹位置,并在执行 jar 时将该位置设置为类路径。

胡子哥哥

您需要src/main/resources使用其相对路径将目录包含到 pom.xml 中的类路径中:&nbsp;<build>&nbsp; &nbsp; <resources>&nbsp; &nbsp; &nbsp; &nbsp; <resource>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <directory>src/main/resources</directory>&nbsp; &nbsp; &nbsp; &nbsp; </resource>&nbsp; &nbsp; </resources>&nbsp;</build>你可以在这里读更多关于它的内容。

www说

正如 Ropert Scholte 提到的修复它一样,我使用 Inputstream 来加载,而不是将其作为文件加载。我用下面的代码修复了它:private Reader loadSchema(String schemaName) throws JsonSchemaMissingException {&nbsp; &nbsp; ClassLoader classLoader = JsonSchemaValidator.class.getClassLoader();&nbsp; &nbsp; InputStream fileStream = classLoader.getResourceAsStream(schemaName);&nbsp; &nbsp; if (fileStream == null) {&nbsp; &nbsp; &nbsp; &nbsp; log.LogErrorWithTransactionId("", "file does not exist ");&nbsp; &nbsp; &nbsp; &nbsp; throw new JsonSchemaMissingException("file does not exist");&nbsp; &nbsp; }&nbsp; &nbsp; Reader reader = new InputStreamReader(fileStream, StandardCharsets.UTF_8);&nbsp; &nbsp; return reader;}请注意,由于我使用该文件来验证 JSON 架构,因此我需要将输入流转换为读取器对象
随时随地看视频慕课网APP

相关分类

Java
我要回答