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

Spring Boot Kotlin项目运行时无法加载Java类问题求助

解决Kotlin+Java混合Spring Boot项目Gradle构建后运行java -jar出现ClassNotFoundException的问题

我之前也碰到过一模一样的情况——混写Kotlin和Java的Spring Boot 2.x项目,用Gradle构建完jar包,运行时偏偏找不到某个类,头疼得不行。结合那次排查的经验,给你几个实用的解决方向:

1. 先把Gradle的Kotlin插件配置捋顺

这是最常见的问题:Kotlin和Java的编译顺序搞反了,或者源码目录没配置对,导致Kotlin类没被正确编译打包。

如果你的构建脚本是Groovy版的build.gradle,请确保配置成这样:

plugins {
    id 'org.springframework.boot' version '2.x.x'
    id 'io.spring.dependency-management' version '1.x.x'
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version '1.x.x'
    id 'org.jetbrains.kotlin.plugin.spring' version '1.x.x'
}

// 核心:让Java编译依赖Kotlin编译,保证Kotlin类先被编译出来
compileJava.dependsOn compileKotlin
compileTestJava.dependsOn compileTestKotlin

// 让Kotlin插件同时处理Java和Kotlin源码,避免重复编译
sourceSets {
    main {
        kotlin {
            srcDirs = ['src/main/kotlin', 'src/main/java']
        }
        java {
            srcDirs = [] // 禁止Java插件再处理Kotlin目录
        }
    }
    test {
        kotlin {
            srcDirs = ['src/test/kotlin', 'src/test/java']
        }
        java {
            srcDirs = []
        }
    }
}

要是用的是Kotlin DSL版build.gradle.kts,对应配置如下:

plugins {
    id("org.springframework.boot") version "2.x.x"
    id("io.spring.dependency-management") version "1.x.x"
    java
    kotlin("jvm") version "1.x.x"
    kotlin("plugin.spring") version "1.x.x"
}

tasks.compileJava {
    dependsOn(tasks.compileKotlin)
}
tasks.compileTestJava {
    dependsOn(tasks.compileTestKotlin)
}

sourceSets {
    main {
        kotlin.srcDirs("src/main/kotlin", "src/main/java")
        java.srcDirs(emptyList<String>())
    }
    test {
        kotlin.srcDirs("src/test/kotlin", "src/test/java")
        java.srcDirs(emptyList<String>())
    }
}

2. 先确认jar包里到底有没有缺失的类

有时候配置没问题,但缓存或者打包过程抽风,导致类没被打进jar包。你可以用这个命令查看jar包内容:

jar tf my_springboot_kotlin_gradle_project.jar

搜一搜有没有com/example/components/utils/EncryptionUtils.class这个文件。如果找不到,那肯定是编译或打包环节漏了,回到第一步检查配置,或者清理缓存重新构建。

3. 检查类的访问权限和包路径

别忽略这种低级错误:

  • 如果是Java类,确保EncryptionUtils是public修饰的;
  • 如果是Kotlin类,要么用默认的public,要么如果是internal的话,要保证调用方和它在同一个模块里;
  • 仔细核对包路径,有没有拼写错误(比如把components写成component)。

4. 清理缓存,重新构建

Gradle的缓存有时候会搞出莫名其妙的问题,执行下面的命令彻底清理后重新构建:

./gradlew clean build

然后去build/libs目录下找到jar包,再用java -jar命令运行试试。


内容的提问来源于stack exchange,提问作者Nasibulloh Yandashev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:12:05