【问题标题】:SBT not generating Avro classesSBT 不生成 Avro 类
【发布时间】:2017-12-11 15:20:08
【问题描述】:

我正在 sbt 中创建一个新项目,但我很难生成 avro 文件。我在我的 sbt 插件中使用avrohugger

$ cat ~/.sbt/0.13/plugins/plugins.sbt
addSbtPlugin("org.ensime" % "sbt-ensime" % "2.0.1")
addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "5.2.3")
addSbtPlugin("com.julianpeeters" % "sbt-avrohugger" % "1.1.0")

并且,按照 avrohugger github 页面上的建议,我正在 build.sbt 中定义 avro 任务的设置:

sourceGenerators in Compile += (avroScalaGenerate in Compile).taskValue

(avroSpecificSourceDirectory in Compile) := new java.io.File("src/main/resources/avro")

(avroScalaSpecificCustomNamespace in Compile) := Map("" -> "avro")

(avroSpecificScalaSource in Compile) := new java.io.File("target/generated-sources/avro")

我也尝试过使用avroScalaGenerateavroScalaGenerateScavro 无济于事。我已经尝试运行特定的任务步骤 (sbt avroScalaGenerateSpecific),它成功但没有可见的输出,即使使用 show 运行也是如此。 cleancompile 在 target 中为常规类生成预期输出,但对于 avro 中的任何内容都没有。所以总的来说,我没有错误消息,但没有结果。

【问题讨论】:

    标签: scala sbt avro


    【解决方案1】:

    经过一番挖掘,这是几个不同的问题。

    首先是(avroSpecificSourceDirectory in Compile) := new java.io.File("src/main/resources/avro") 不是完整的命名空间,这实际上有所作为。我使用的是my.cool.namespace,因为我的文件夹 不正确,并且其中还有.。重新制作文件夹结构以匹配预期的命名空间,并将其更改为斜线,帮助它找到所需的文件。

    我能够删除命名空间映射,因为我的 avro 定义不需要它,而且我不需要输出文件夹,因为默认值很好。

    最后,我修复了编译步骤中使用的生成器,并在整个构建文件中使用了特定的记录生成器。

    所以现在,相关且已完成的build.sbt 部分如下所示:

    //add avro generation to the compile step
    sourceGenerators in Compile += (avroScalaGenerateSpecific in Compile).taskValue
    
    //tell the avro compiler where to look for avro sources.
    (avroSpecificSourceDirectory in Compile) := new java.io.File("src/main/resources/my/cool/namespace/avro")
    

    这会在需要时生成 avro 而不会出现任何错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 2017-04-16
      • 1970-01-01
      相关资源
      最近更新 更多