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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 08:54:17