如何获得springboot资源文件夹中资源的绝对路径?

laik7k3q  于 2023-02-22  发布在  Spring
关注(0)|答案(1)|浏览(246)

我在Java springboot项目的resources文件夹中有一个文件夹...

我试图在本地运行代码时以及在项目已打包到jar文件中(使用maven)时获取此文件的文件路径
问题是在打包项目时,文件的位置会更改为类似...\backend-1.0-SNAPSHOT-exec.jar\BOOT-INF\classes\google-oauth\credential.json的位置
我已经尝试了多种方法来引用这个文件,但都没有成功。我已经花了大约4个小时试图找到一种方法来动态引用这个文件的位置,我已经精疲力竭了。
我目前的方法在本地运行时效果很好(除了我必须手动剥离前导正斜杠并将正斜杠转换为反斜杠,这很糟糕),除了一旦应用程序被打包,它就不再工作了(我不知道为什么)。

// Get the location of the credential.json file regardless of the OS separator or if the app is running locally or packaged
URL credentialLocationURL = Application.class.getClassLoader().getResource("google-oauth/credential.json");
String credentialLocation = URLDecoder.decode(credentialLocationURL.getPath(), "UTF-8");

// Remove leading slashes, the word 'file:', and replace remaining slashes with the proper system file separator character
credentialLocation = credentialLocation.substring(1);
credentialLocation = credentialLocation.replaceAll("ile:/", "");
credentialLocation = credentialLocation.replace('/', File.separatorChar);

GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new FileReader(credentialLocation));

使用此代码时,应用程序崩溃,并引用以下错误:java.io.FileNotFoundException: C:\Users\My Username\IdeaProjects\sigilLab\backend\target\backend-1.0-SNAPSHOT-exec.jar!\BOOT-INF\classes!\google-oauth\credential.json (The system cannot find the path specified)
我也尝试过this solution,但得到了不同的(尽管相似)错误
我用于该方法的代码:

URL resource = Application.class.getResource("/google-oauth/credential.json");
String credentialLocation = Paths.get(resource.toURI()).toString();

GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new FileReader(credentialLocation));

Error creating bean with name 'com.lessons.services.GoogleOauthService': Invocation o f init method failed; nested exception is java.nio.file.FileSystemNotFoundException

    • 可能还值得一提的是,我正在使用@PostConstruct装饰器运行这个函数,它可能在资源文件构造之前运行这个函数。我对Springboot如何处理这个问题并不完全熟悉。**

任何帮助都将不胜感激。

jgwigjjp

jgwigjjp1#

打包到jar存档中的文件不是FileReader可以读取的全功能文件。但是,GoogleClientSecrets接受任何Reader,因此只需使用InputStreamReader

GoogleClientSecrets.load(JacksonFactory.getDefaultInstance(), new InputStreamReader(Application.class.getResourceAsStream("/google-oauth/credential.json"));

相关问题