java – 如何指定war文件中资源的路径?

我使用文本编辑器使用maven和 spring框架构建我的项目.

我可以使用终端上的命令运行项目根文件夹

mvn spring-boot:run

我使用java语句引用了java文件中的源文件

Document doc = builder.parse("src/main/resources/data/resorts.xml");

一切正常.

当我使用该命令将整个项目导出为war文件时

mvn package

在终端上

我在根目录的目标文件夹中获得了一个war文件

我使用命令运行war文件

java -jar filename.war

没有编译错误,但在运行时它显示错误java.io.FileNotFoundException

我想我没有正确指定参考文件的路径

你能提一下如何在路径字符串中提到相对路径,以便能够从war文件中运行它.

我的目录结构是

.
    |-- src
    |   `-- main
    |       |-- java
    |       |   `-- hello
    |       |       `-- org
    |       |           `-- json
    |       `-- resources
    |           |-- data
    |           `-- templates
    `-- target
        |-- classes
        |   |-- data
        |   |-- hello
        |   |-- org
        |   |   `-- json
        |   `-- templates
        |-- generated-sources
        |   `-- annotations
        |-- gs-handling-form-submission-0.1.0
        |   |-- META-INF
        |   `-- WEB-INF
        |       |-- classes
        |       |   |-- data
        |       |   |-- hello
        |       |   |-- org
        |       |   |   `-- json
        |       |   `-- templates
        |       `-- lib
        |-- maven-archiver
        `-- maven-status
            `-- maven-compiler-plugin
                `-- compile
                    `-- default-compile

    33 directories

java文件位于hello目录中.

最佳答案 您可能遇到从URI类接收的路径到位于jar内的文件的问题.

Application.class.getClassLoader().getResource("path-to/filename.txt").getPath()

输出:/path-to-your/application.jar!/path-to/filename.txt

如果您尝试创建File对象或Stream到该路径,它将失败并出现FileNotFoundException

如果可能,您应该更改类Document以接收文件或InputStream的内容.
然后,您可以使用类加载器来获取文件的流而不是路径.

在你的情况下:

InputStream is = Application.class.getClassLoader()
            .getResourceAsStream("data/resorts.xml");

然后使用is对象创建Document.

点赞