Gradle run时getClass().getClassLoader().getResource()返回Null问题
问题解决:Gradle运行时无法加载资源文件
根本原因
你在代码中使用src/main/resources/File作为资源路径是错误的:
- IntelliJ运行时会将源码目录(包括
src/main/resources)直接加入类路径,所以这种非标准路径能临时生效 - Gradle构建后,资源文件会被复制到
build/resources/main目录下的对应包路径中,此时类路径的根是build/classes/java/main和build/resources/main,src/main/resources这个源码路径在运行时根本不存在于类路径中
解决方案
1. 修正资源加载路径
根据你的项目结构,资源文件位于src/main/resources/it/uni/cs/name/progettofinaledatemplate/下,需要使用类路径相对路径加载:
- 如果资源与当前类在同一个包下(比如你在
it.uni.cs.name.progettofinaledatemplate.controller包的类中加载资源),直接使用:URL url = getClass().getResource("File"); - 如果资源在全局包路径下,使用类加载器加载时,路径要从类根目录开始:
✅ 注意:路径开头不要加URL url = getClass().getClassLoader().getResource("it/uni/cs/name/progettofinaledatemplate/File");/,也不要包含src/main/resources前缀
2. 验证Gradle资源复制
执行以下命令确保资源被正确复制到构建目录:
./gradlew processResources
然后检查build/resources/main/it/uni/cs/name/progettofinaledatemplate/下是否存在你的资源文件,如果不存在,需要检查资源文件名是否大小写正确(Java类路径区分大小写)
3. 移除多余的Gradle配置
Gradle默认已经将src/main/resources作为主资源目录,你添加的sourceSets配置是多余的,建议删除:
// 删掉这段不必要的配置 sourceSets { main { resources { srcDir 'src/main/resources' } } }
多余的配置可能导致资源复制逻辑冲突
验证修复
执行以下命令重新运行项目:
./gradlew clean run
内容的提问来源于stack exchange,提问作者Luca Porfiri
相关产品推荐
相关产品推荐

