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
相关产品推荐
相关产品推荐

