我在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")
我也试过使用avroScalaGenerate
和avroScalaGenerateScavro
无济于事。我已尝试运行特定任务步骤(sbt avroScalaGenerateSpecific
),该步骤成功但没有可见输出,即使使用show
运行也是如此。 clean
和compile
在常规类的目标中生成预期输出,但不生成avro中的任何内容。总而言之,我没有留下任何错误消息,但没有结果。
答案 0 :(得分:0)
经过一番挖掘,这是一些不同的问题。
首先,(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而不会出现任何错误。