2016-10-01 30 views
1

我有小測試類是這樣的:Test.scala:1:未使用進口包test.avro

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,但隱含的錯誤將未使用的我M端口。然而,這是在版本1.5.0 - 我使用版本1.6.1(並嘗試了幾個版本之間檢查,如果這不是一些隨機迴歸)。將avro4j導入到import com.sksamuel.avro4s._也沒有幫助。

另一方面,錯誤消息類似於this one。我使用Scala 2.11.8,但爲防萬一我檢查是否改爲2.11.7會有幫助(它沒有)。

還有什麼我可以嘗試弄清楚這種怪異行爲的來源是什麼?這是我錯過的東西還是一個錯誤?我應該在哪裏存檔?我懷疑這是ToRecord特徵宏,但我無法確定。

編輯:刪除"-Ywarn-unused-import"使事情再次工作 - 我應該假設它是一個庫中的錯誤?

回答

1

看來avro4s'ToRecord宏生成一些未使用的導入。該宏有if-else子句,所以我猜(至少)其中一種情況不會使用前面所有的導入。

加上Scala編譯器中的這個(或類似的)錯誤 - https://issues.scala-lang.org/browse/SI-9616 - 它會導致警告出現,並且"-Xfatal-warnings"會導致構建失敗。

我的解決方法是添加:

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

到使用avro4s模塊。當它得到修復時(在scalacavro4s)我將刪除它。

更新:版本1.6.2中解決的問題。