java类编译“找不到”主因是gradle未识别源文件:需确保.java在src/main/java下、同时启用java和kotlin("jvm")插件、统一jvmtarget版本,并执行clean清除缓存。

Java类在Gradle Kotlin项目里编译时“找不到”,90%是因为它根本没被编译——不是路径错、不是依赖漏,是Gradle压根没看见那个.java文件。
Java源码没放在src/main/java里
Gradle默认只扫描src/main/java(Java)和src/main/kotlin(Kotlin)两个目录。如果你把Test.java随手扔进src/main/kotlin/com/example/,Kotlin插件会忽略它,Java插件也找不到它——因为那不是它的职责范围。
- 检查当前
.java文件实际路径,确认是否在src/main/java/下(哪怕只是建个空包再挪过去) - 不要指望
kotlin("jvm")插件自动接管Java源码;它只负责Kotlin编译,Java仍由java插件管 - 如果非得混放(比如历史项目迁移中),必须显式配置
sourceSets,但不推荐:容易漏掉test或androidTest等变体路径
java插件没启用或顺序不对
Kotlin项目默认只加了kotlin("jvm"),但Java代码需要java插件参与编译流程。没它,compileJava任务根本不存在,自然不会处理任何.java文件。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 在
build.gradle.kts顶部确保同时应用两个插件:plugins { java; kotlin("jvm") version "X.Y.Z" } - 顺序无关紧要,但缺一不可;只写
kotlin("jvm")会导致Java源码静默跳过 - Android项目则用
com.android.application或com.android.library,它们内部已包含Java支持,无需额外加java插件
JVM目标版本不一致导致符号解析失败
即使Java类编译成功,Kotlin代码调用时仍可能报Cannot resolve symbol——常见于compileKotlin和compileJava的jvmTarget不统一。例如Java设为17,Kotlin设为1.8,字节码兼容性断裂,IDE和编译器都可能拒绝链接。
- 统一设置JVM目标:
kotlin { jvmToolchain(17) }+java { sourceCompatibility = JavaVersion.VERSION_17; targetCompatibility = JavaVersion.VERSION_17 } - Android项目请同步
compileSdk、targetSdk与android.compileOptions.sourceCompatibility,否则AGP会主动报Inconsistent JVM-target compatibility detected - 注意:这是编译期约束,不是运行环境要求;本地JDK版本可以更高(如JDK 21),只要
jvmTarget对齐即可
最常被忽略的一点:Gradle缓存会记住旧的源码结构。改完路径和插件后,务必执行./gradlew --stop && ./gradlew clean,否则IDE可能还在用上一轮残留的class输出。别信“刷新一下就行”,这问题从来不是刷新能解决的。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










