You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gmail API出现FileNotFoundException:凭证JSON文件无法定位求助

解决FileNotFoundException:无法定位credentials.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:53:11