无main方法启动Spring应用报错:未找到自动配置类
解决方案
问题根源
Velocity插件的Jar是普通Jar结构,而Spring Boot默认生成的是带特殊启动层的可执行Jar,导致自动配置所需的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports元数据文件没有被正确打包到插件Jar中,或者Spring启动时无法通过Velocity的类加载器读取到这些文件。
步骤1:调整Gradle打包配置
修改build.gradle.kts,禁用Spring Boot的可执行Jar打包,确保生成普通Jar并保留必要的元数据:
plugins { id("org.springframework.boot") version "你的Spring Boot版本" apply false // 不自动应用bootJar id("io.spring.dependency-management") version "你的依赖管理版本" kotlin("jvm") version "你的Kotlin版本" kotlin("plugin.spring") version "你的Kotlin版本" } // 禁用Spring Boot的可执行Jar任务,启用普通Jar打包 tasks.bootJar { enabled = false } tasks.jar { // 确保Spring自动配置元数据被打包进Jar from(sourceSets.main.get().output) { include("META-INF/spring/**/*") include("META-INF/spring.factories") // 兼容旧版Spring Boot自动配置 } // 可选:将所有依赖打包进插件Jar(若Velocity不提供依赖隔离) from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) }) } dependencyManagement { imports { mavenBom(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES) } } dependencies { implementation("org.springframework.boot:spring-boot-starter") implementation("com.velocitypowered:velocity-api:你的Velocity版本") compileOnly("com.velocitypowered:velocity-proxy:你的Velocity版本") // 添加你需要的其他Spring依赖 }
步骤2:适配Spring启动的类加载器
Velocity插件由外部主Jar加载,类加载器上下文与普通Spring Boot应用不同,启动时需指定插件自身的类加载器:
class YourVelocityPlugin(loader: PluginLoader, server: ProxyServer) : VelocityPlugin { init { // 获取插件专属的类加载器 val pluginClassLoader = this.javaClass.classLoader // 启动Spring时指定类加载器,确保能读取到元数据 runApplication<SpringApp>(emptyArray()) { setClassLoader(pluginClassLoader) // 可选:关闭Spring Banner输出,避免干扰Velocity日志 setBannerMode(Banner.Mode.OFF) } } } @SpringBootApplication class SpringApp
步骤3:手动指定自动配置类(兜底方案)
如果元数据文件仍无法被读取,直接在Spring启动类中导入所需的自动配置类:
@SpringBootApplication @ImportAutoConfiguration( // 按需添加你需要的自动配置类,示例: org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration::class, org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration::class ) class SpringApp
验证步骤
- 执行
./gradlew jar生成插件Jar - 将Jar放到Velocity的
plugins文件夹 - 启动Velocity服务,检查Spring是否正常初始化,无自动配置类找不到的报错
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

