Gmail API出现FileNotFoundException:凭证JSON文件无法定位求助
核心原因
class.getResourceAsStream()是从**类路径(classpath)**中加载资源,而非项目根目录。你当前的路径配置既不符合类路径的相对定位规则,也未将目标文件纳入类路径范围,导致加载失败。
解决方案
方案1:将文件移至标准资源目录(推荐)
Maven/Gradle项目的标准资源目录是src/main/resources,将credential文件夹移入该目录,然后修改代码中的路径为类路径绝对路径:
private static final String CREDENTIALS_FILE_PATH = "/credential/credentials.json"; InputStream in = EmailManager.class.getResourceAsStream(CREDENTIALS_FILE_PATH); if (in == null) { throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH); }
这样资源会被自动打包到类路径中,getResourceAsStream能直接从类路径根目录定位到文件。
方案2:直接从文件系统加载(不推荐用于生产环境)
如果不想移动文件,可通过项目根目录拼接路径读取文件,利用System.getProperty("user.dir")获取项目根目录:
private static final String CREDENTIALS_FILE_PATH = "credential/credentials.json"; // 获取项目根目录,拼接文件路径 File credentialFile = new File(System.getProperty("user.dir"), CREDENTIALS_FILE_PATH); InputStream in = new FileInputStream(credentialFile);
注意:此方式依赖运行时的工作目录,打包部署后可能需要调整路径。
方案3:通过构建工具配置将自定义目录纳入类路径
如果是Maven项目,在pom.xml中添加资源配置,将项目根目录下的credential文件夹纳入类路径:
<build> <resources> <resource> <directory>${project.basedir}/credential</directory> <includes> <include>**/*.json</include> </includes> </resource> </resources> </build>
配置完成后,使用方案1中的代码即可加载文件。
原路径失效的原因
你原代码中的路径.//credential//credentials.json是相对EmailManager类的包路径定位的:
EmailManager位于src/main/java/com/rev/manager,对应类路径下的位置是/com/rev/manager/,所以相对路径会解析为/com/rev/manager/./credential/credentials.json,即/com/rev/credential/credentials.json,与你实际的文件位置不匹配,因此返回null并抛出异常。
内容的提问来源于stack exchange,提问作者Ivan

