使用Scala 2.11反射时"涉及对象InterfaceAudience的非法循环引用"

Har*_*man 5 scala scala-reflect

我在scala 2.11.7上遇到了上述错误:

def main(args: Array[String]): Unit = {
  val x = typeOf[ org.apache.hadoop.io.Writable ]
  println( x )
}
Run Code Online (Sandbox Code Playgroud)

我的编译过程的其他信息:

我已经缩小到重现所需的最低限度:

我有一个build.gradle项目,如下所示:

buildscript {
  repositories {
      mavenCentral()
      maven {
        name 'Shadow'
        url 'http://dl.bintray.com/content/johnrengelman/gradle-    plugins'
      }
  }
  dependencies {
    classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.1'
  }
}

apply plugin: 'com.github.johnrengelman.shadow'
apply plugin: 'scala'

repositories {
    mavenCentral()
}

dependencies 
{
  compile group: 'org.scala-lang', name: 'scala-library', version: '2.11.7'
  compile group: 'org.scala-lang', name: 'scala-reflect', version: '2.11.7'
  compile( "org.apache.hadoop:hadoop-common:2.4.0" )
}
Run Code Online (Sandbox Code Playgroud)

这是我的主要内容:

import scala.reflect.runtime.universe._

object Test 
{
  def main(args: Array[String]): Unit = {
     val x = typeOf[ org.apache.hadoop.io.Writable ]
     println( x )
  }  
}
Run Code Online (Sandbox Code Playgroud)

建筑用:

gradle clean shadow
Run Code Online (Sandbox Code Playgroud)

生成一个包含所有依赖项的jar.

java -cp ./build/libs/uber.jar Test
Run Code Online (Sandbox Code Playgroud)

结果出现上述异常

Ero*_*ght 0

Scala 似乎无法反映 Hadoop 注释,例如InterfaceAnnotations. 解决方案是排除hadoop-annotations依赖:

configurations {
    all*.exclude group: 'org.apache.hadoop', module: 'hadoop-annotations'
}
Run Code Online (Sandbox Code Playgroud)