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

Docker部署Kotlin+Spring应用报错:找不到主类com.project.mainapplication

解决Kotlin Spring应用Docker部署找不到主类的问题

问题分析

你遇到的ClassNotFoundException核心原因是Docker容器中运行的jar包缺少主类配置,或是复制的jar并非Spring Boot生成的可执行jar。纯Java项目能正常运行,是因为Java项目的Gradle配置默认生成了正确的可执行jar,但Kotlin项目需要额外确认配置细节。

可能的原因及解决步骤

1. 检查Gradle配置是否正确生成可执行jar

Kotlin Spring项目必须确保Gradle应用了Spring Boot插件,并正确配置主类:

  • 打开build.gradle.kts(或build.gradle),确认包含Spring Boot插件:
plugins {
    id("org.springframework.boot") version "3.2.0" // 替换为你的Spring Boot版本
    id("io.spring.dependency-management") version "1.1.4"
    kotlin("jvm") version "1.9.20"
    kotlin("plugin.spring") version "1.9.20"
}
  • 若主类未被自动检测到,手动指定主类(注意Kotlin类名首字母大写):
springBoot {
    mainClass.set("com.project.MainApplication")
}

2. 修改Dockerfile,确保复制的是Spring Boot可执行jar

Gradle构建Spring Boot项目时会生成两个jar:

  • 普通jar:不带-boot后缀,仅包含项目编译类,无主类清单
  • 可执行jar:带-boot后缀,包含所有依赖和主类配置

修改Dockerfile,明确复制可执行jar:

FROM gradle:latest AS build
COPY --chown=gradle:gradle . /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle clean bootJar  # 直接执行bootJar任务,生成可执行jar

FROM openjdk:17-oracle
# 复制带-boot后缀的可执行jar到容器
COPY --from=build /home/gradle/src/build/libs/*-boot.jar /app/app.jar
ENTRYPOINT ["java","-jar","/app/app.jar"]

3. 确认主类名称大小写匹配

Kotlin对类名大小写敏感,检查你的主类实际代码:

  • 若主类代码如下:
package com.project

@SpringBootApplication
class MainApplication

fun main(args: Array<String>) {
    runApplication<MainApplication>(*args)
}

则主类应为com.project.MainApplication,而非报错中的全小写com.project.mainapplication。确保Gradle配置和运行时的主类名称完全一致。

4. 验证本地构建的jar是否正常

在本地执行gradle bootJar后,进入build/libs目录,运行以下命令验证jar:

java -jar [你的项目名]-[版本]-boot.jar

若本地能正常运行,说明jar无问题,重新构建Docker镜像即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 11:47:45