根Gradle项目中应用Shadow插件时Quarkus的quarkusGenerateCode任务执行失败
根Gradle项目中应用Shadow插件时Quarkus的quarkusGenerateCode任务执行失败
我之前在维护混合Spring Boot和Quarkus的多模块Gradle项目时,也碰到过一模一样的问题——Shadow插件的类路径干扰导致Quarkus代码生成阶段出现Log4j2的方法找不到错误。其实核心原因是Shadow插件的依赖会渗透到所有子项目的类路径里,哪怕你在根项目里加了apply false,Quarkus的代码生成任务还是会意外加载到它的相关类,引发冲突。
解决方案:仅在Spring Boot子项目中应用Shadow插件
我们可以通过插件的声明与应用分离来解决这个冲突,让Shadow插件只在需要它的Spring Boot子项目中生效,完全不影响Quarkus子项目。
1. 保持根项目的插件声明(不变)
根build.gradle.kts的配置可以保留你原来的样子,确保Shadow插件只是声明但不全局应用:
plugins { kotlin("jvm") version "2.0.21" id("com.github.johnrengelman.shadow") version "8.1.1" apply false id("io.quarkus") version "3.18.2" } repositories { mavenCentral() gradlePluginPortal() } group = "com.example" version = "1.0.0-SNAPSHOT" java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 }
2. 在Spring Boot子项目中单独应用Shadow插件
打开你的Spring Boot子项目的build.gradle.kts,在插件块中添加Shadow插件的应用,同时保留Spring Boot相关的插件配置:
plugins { id("org.springframework.boot") version "3.3.4" // 替换成你的Spring Boot版本 id("io.spring.dependency-management") version "1.1.6" // 对应Spring Boot的依赖管理版本 kotlin("jvm") id("com.github.johnrengelman.shadow") // 直接应用,版本由根项目声明控制 } // 配置ShadowJar生成适合AWS Lambda的Fat Jar shadowJar { archiveBaseName.set("your-spring-boot-lambda") archiveClassifier.set("all") // 如果需要,可以添加更多Shadow配置,比如排除不必要的依赖 } // 可选:让build任务自动执行shadowJar tasks.named("build") { dependsOn(tasks.named("shadowJar")) }
3. 确保Quarkus子项目不引入Shadow插件
你的Quarkus子项目的build.gradle.kts只需要保留Quarkus和Kotlin插件,不要添加Shadow相关配置:
plugins { id("io.quarkus") kotlin("jvm") } // 其他Quarkus相关配置(依赖、任务自定义等)
额外排查(如果问题仍然存在)
如果还是遇到类冲突,可以尝试在Quarkus子项目中显式过滤掉Shadow相关的类路径:
tasks.withType<io.quarkus.gradle.tasks.QuarkusGenerateCode> { classpath = classpath.filter { file -> !file.name.contains("shadow") && !file.path.contains("shadow") } }
这样配置后,Spring Boot子项目可以正常生成适合AWS Lambda的Fat Jar,而Quarkus的代码生成任务也不会再受Shadow插件的干扰,完美解决两者的共存问题。
备注:内容来源于stack exchange,提问作者Leo.Kim
相关产品推荐
相关产品推荐

