如何为Kotlin Spring Boot应用创建共享代码且不引入全量依赖的CLI工具
解决方案
一、代码存放位置优化
新增独立源码目录存放CLI工具代码,既避免和主应用代码混淆,也不会参与主应用的构建流程。
Gradle配置(Kotlin DSL)
在项目根目录的build.gradle.kts中添加自定义源码集配置:
sourceSets { create("cli") { kotlin.srcDir("src/cli/kotlin") resources.srcDir("src/cli/resources") // 共享主应用的编译和运行时依赖 compileClasspath += sourceSets.main.get().compileClasspath runtimeClasspath += sourceSets.main.get().runtimeClasspath } } // 为CLI源码集添加必要的核心依赖 dependencies { "cliImplementation"(platform("org.springframework.boot:spring-boot-dependencies:${property("springBootVersion")}")) "cliImplementation"("org.springframework.boot:spring-boot-starter") "cliImplementation"("org.springframework.boot:spring-boot-configuration-properties") // 依赖主应用编译后的代码,实现代码共享 "cliImplementation"(sourceSets.main.get().output) } // 创建运行CLI的Gradle任务 tasks.register<JavaExec>("runCli") { classpath = sourceSets["cli"].runtimeClasspath mainClass.set("com.yourpackage.TheUtility") // 支持传入命令行参数,比如 ./gradlew runCli -PcliArgs="arg1 arg2" args = project.properties["cliArgs"]?.toString()?.split(" ") ?: emptyList() }
之后将CLI代码放在src/cli/kotlin目录下,资源文件(如专属配置)放在src/cli/resources,运行时执行./gradlew runCli即可。
二、精简Spring Boot启动,排除不必要组件
1. 替换主类注解,精准控制组件加载
将原有的@SpringBootApplication替换为更精细的注解组合,避免触发全量自动配置:
import org.springframework.boot.CommandLineRunner import org.springframework.boot.SpringApplication import org.springframework.boot.WebApplicationType import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.ComponentScan import org.springframework.context.annotation.Configuration @Configuration // 只扫描CLI需要的包(比如TheClient和TheConfig所在的包) @ComponentScan(basePackages = ["com.yourpackage.client", "com.yourpackage.config"]) // 启用配置属性绑定,加载TheConfig @EnableConfigurationProperties(TheConfig::class) class TheUtility(private val client: TheClient) : CommandLineRunner { override fun run(vararg args: String) { // 编写你的CLI业务逻辑 client.executeTask(args) } } fun main(vararg args: String) { SpringApplication(TheUtility::class.java) .setWebApplicationType(WebApplicationType.NONE) // 禁用Web环境,避免Tomcat启动 .run(*args) }
2. 排除多余自动配置(按需添加)
如果仍有不必要的组件启动,可在CLI专属配置文件src/cli/resources/application.yml中添加排除规则:
spring: autoconfigure: exclude: - org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration - org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration - org.springframework.boot.autoconfigure.kubernetes.KubernetesAutoConfiguration # 根据日志输出,继续添加需要排除的自动配置类
3. 修正TheClient的注解
TheClient是普通组件,无需@Configuration注解,修改为:
@Component class TheClient( private val config: TheConfig, @Value("classpath:more-config.json") private val json: Resource ) { // ... 原有业务逻辑 }
三、验证效果
运行CLI工具后,启动日志只会显示Spring核心组件的初始化信息,不会出现JDBC、Tomcat、Hibernate等无关组件的启动日志,同时能正常注入TheClient和TheConfig,实现代码共享与依赖注入的需求。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

