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

SBT编译后assembly打包前如何运行Scala脚本生成Case类对应JSON schema

实现方法

完全可以实现,通过自定义SBT任务绑定构建生命周期即可完成需求,以下是具体配置步骤:

步骤1:编写Schema生成逻辑

你可以把生成JSON Schema的逻辑封装为项目内的可执行对象,示例结构:

// src/main/scala/com/yourcompany/SchemaGenerator.scala
package com.yourcompany

import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.databind.ObjectMapper
// 可根据实际技术选型替换为circe、avro4s等Schema生成库
import com.github.victools.jsonschema.generator._

object SchemaGenerator extends App {
  val generator = new SchemaGenerator(new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_2020_12, OptionPreset.PLAIN_JSON).build())
  val schema = generator.generateSchema(classOf[你的业务Case类])
  // 指定生成路径到资源目录,确保被打进Jar
  val outputPath = new java.io.File("src/main/resources/schemas/data_schema.json")
  outputPath.getParentFile.mkdirs()
  new ObjectMapper().writerWithDefaultPrettyPrinter().writeValue(outputPath, schema)
}

步骤2:配置build.sbt绑定任务顺序

在项目的build.sbt中添加以下配置,保证执行顺序为编译 -> 生成Schema -> 打包Assembly:

// 定义生成Schema的自定义任务
val generateSchema = taskKey[Unit]("Generate JSON schema from case classes")

// 任务实现:运行刚才写的SchemaGenerator对象
generateSchema := (Compile / runMain).toTask(" com.yourcompany.SchemaGenerator").value

// 绑定任务依赖:生成Schema必须在编译完成后执行
generateSchema := generateSchema.dependsOn(Compile / compile).value

// 绑定任务依赖:assembly打包必须在生成Schema完成后执行
assembly := assembly.dependsOn(generateSchema).value

注意事项

  • 如果不想把SchemaGenerator放到业务源码中,也可以将逻辑放在project/目录下,或者直接配置任务执行独立的Scala脚本:
    generateSchema := {
      val scriptPath = baseDirectory.value / "scripts" / "generate_schema.scala"
      s"scala $scriptPath" !
    }
    
  • 生成的Schema文件建议放到src/main/resources或者Compile / resourceManaged对应的目录下,这两个目录下的文件会被默认打入Assembly Jar的classpath,运行时可以直接通过getClass.getResourceAsStream("/schemas/data_schema.json")读取
  • 若生成的Schema不需要提交到代码仓库,可以指定输出路径为target/scala-xxx/resource_managed目录,避免污染源码目录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:54:03