如何获取jar外部文件的Url?

问题描述

我已经使用maven-assembly-plugin以分解模式部署了spring boot应用程序。我已经从项目的资源文件夹中创建了config文件夹。

问题是我无法获取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   

我希望将文件的URL存储在myfolder中。第三方(例如毕加索)将访问此URL,以获取文件数据。我无法获得指向此myfolder文件的正确网址。

解决方法

注意:这不是特定于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对象而不是File,这很简单,只需致电:

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

如果要将所有文件都放在config目录下,则可以使用以下命令首先列出它们:

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

很容易,您需要提供外部application.properties文件的完整路径,而不是在运行时spring-boot.jar应用程序启动期间源代码中提供的完整路径。

示例:java -jar -Dspring.config.location = file://

此外部文件的优先级高于我们jar文件中的外部文件。