首页 > 解决方案 > 如何获取 jar 外部文件的 Url?

问题描述

我已经使用 maven-assembly-plugin 以爆炸模式部署了 Spring Boot 应用程序。我从项目的资源文件夹中创建了配置文件夹。

问题是我无法获取 url 来访问 config 文件夹中的文件。

如何获取已上传并存储在此配置文件夹中的文件的 url。

文件结构

目标文件夹:

+springdemo-0.0.1-application.zip
   +config
     +myfolder
        -oldfile.png
   +springdemo-0.0.1.jar    //running this jar file
   +start.sh
-springdemo-0.0.1.jar   

我想要存储在 myfolder 中的文件的 URL。该 url 将被第 3 方(例如 Picasso)访问以获取文件数据。我无法获得指向此 myfolder 文件的正确 url。

标签: javaspringspring-bootjar

解决方案


注意:不是 SpringBoot 特定的答案,只是简单的 Java 方式。

您只能尝试猜测文件的位置,因为在运行 Java 应用程序时无法知道工作目录。

例如,如果您控制 Java 应用程序的执行方式,您可以尝试一种非常简单的方法:

var configFile = new File("config/application.properties");

只要该过程是从所在的同一目录开始的start.sh(这似乎是您想要的),这将起作用。

如果它不起作用,请先尝试像这样打印工作目录:

System.out.println("WRK DIR = " + new File(".").getAbsolutePath());

这将告诉您文件的相对路径应该是什么。所以,如果打印出来<root-dir>/springdemo并且你知道你的配置文件在 下<root-dir>/springdemo/mydir/config/,那么文件路径应该是:

new File("mydir/config/application.properties");

顺便说一句,您可以通过以下方式轻松读取文件:

// read file into List of lines
Files.readAllLines(configFile);

// specifically, for properties file
var props = new Properties();
props.load(new FileInputStream(configFile));

如果出于某种原因您需要 URL 对象而不是文件,这很简单,只需调用:

URL url = configFile.toURI().toURL()

如果您想要配置目录下的所有文件,您可以首先列出它们:

File[] files = configFile.getParentFile().listFiles();
if (files != null) {
    for (File file : files) {
        // use file?
    }
}

推荐阅读