我在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如何处理这个问题并不完全熟悉。**
任何帮助都将不胜感激。
1条答案
按热度按时间jgwigjjp1#
打包到jar存档中的文件不是FileReader可以读取的全功能文件。但是,GoogleClientSecrets接受任何Reader,因此只需使用InputStreamReader: