1

我有这样的小测试课:

package test.avro

object Test extends App {
  import java.io.ByteArrayOutputStream
  import com.sksamuel.avro4s.AvroOutputStream

  case class Composer(name: String, birthplace: String, compositions: Seq[String])
  val ennio = Composer("ennio morricone", "rome", Seq("legend of 1900", "ecstasy of gold"))

  val baos = new ByteArrayOutputStream()
  val output = AvroOutputStream.json[Composer](baos)
  output.write(ennio)
  output.close()
  print(baos.toString("UTF-8"))
}

使用相关设置:

scalaVersion := "2.11.8"
scalacOptions ++= Seq("-Ywarn-unused-import", "-Xfatal-warnings")
libraryDependencies += "com.sksamuel.avro4s" %% "avro4s-core" % "1.6.1"

当我尝试编译它时,我收到以下错误消息:

[error] [path on my drive...]/src/main/scala/test/avro/Test.scala:1: Unused import
[error] package test.avro
[error] ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed

我看到在avro4s issue tracker上报告了类似的错误,但隐含错误不是未使用的导入。但是那是在版本中1.5.0-我正在使用版本1.6.1(并在中间尝试了几个版本来检查这是否不是随机回归)。将 avro4j 导入更改为import com.sksamuel.avro4s._也无济于事。

另一方面,错误消息与类似。我使用 Scala 2.11.8,但以防万一我检查更改为 2.11.7 是否有帮助(它没有)。

我还能尝试找出这种奇怪行为的根源是什么?这是我错过的东西还是错误?那么我应该在哪里归档呢?我怀疑这是带有ToRecord特征宏的东西,但我不能确定。

编辑:删除"-Ywarn-unused-import"使事情再次起作用-我应该假设它是库中的错误吗?

4

1 回答 1

1

似乎avro4s'ToRecord宏会生成一些未使用的导入。该宏具有 if-else 子句,因此我猜(至少)其中一种情况不使用所有先前的导入。

连同 Scala 编译器中的这个(或类似的)错误 - https://issues.scala-lang.org/browse/SI-9616 - 它会导致出现警告,并"-Xfatal-warnings"导致构建失败。

我的解决方法是添加:

scalacOptions --= Seq("-Ywarn-unused-import")

到使用avro4s. 当它得到修复时(在scalac或中avro4s)我将删除它。

更新:问题已在 1.6.2 版中解决。

于 2016-10-12T22:03:12.007 回答