14

试图从 jdk 10 切换到 11 并且无法弄清楚是什么库调用了这个异常:

Caused by: org.gradle.api.GradleException: failed to read class file ../../SomeTestFile.class
...
...
Caused by: java.lang.UnsupportedOperationException
        at org.objectweb.asm.ClassVisitor.visitNestMemberExperimental(ClassVisitor.java:248)
        at org.objectweb.asm.ClassReader.accept(ClassReader.java:651)
        at org.objectweb.asm.ClassReader.accept(ClassReader.java:391)
        at org.gradle.api.internal.tasks.testing.detection.AbstractTestFrameworkDetector.classVisitor(AbstractTestFrameworkDetector.java:124)

我正在使用带有以下内容的 gradle wrapper(v4.10.2) build.gradle

buildscript {
    ext {
        springBootVersion = '2.0.5.RELEASE'
        schemaDownloadVersion = '1.6'
        generateAvroVersion = '0.14.2'
    }
    repositories {
        mavenCentral()
        maven { url "https://plugins.gradle.org/m2/" }
        maven { url "http://packages.confluent.io/maven/" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("gradle.plugin.com.amit.plugin.download-registry:registry-schema-download-plugin:${schemaDownloadVersion}")
        classpath("com.commercehub.gradle.plugin:gradle-avro-plugin:${generateAvroVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'com.amit.plugin.download-registry'
apply plugin: 'com.commercehub.gradle.plugin.avro'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 11

repositories {
    mavenCentral()
}

ext {
    springCloudVersion = 'Finchley.RELEASE'
    jaxbVersion = '2.3.0'
    activationVersion = '1.1.1'
    jmockitVersion = '1.43'
    lombokVersion = '1.18.2'
}

jacoco {
    toolVersion = '0.8.2'
}

dependencies {
    compile('org.springframework.cloud:spring-cloud-starter-oauth2')
    compile("javax.xml.bind:jaxb-api:${jaxbVersion}")
    compile("com.sun.xml.bind:jaxb-core:${jaxbVersion}")
    compile("com.sun.xml.bind:jaxb-impl:${jaxbVersion}")
    compile("javax.activation:activation:${activationVersion}")
    compileOnly("org.projectlombok:lombok:${lombokVersion}")
    testCompile("org.jmockit:jmockit:${jmockitVersion}")
    testCompile('org.springframework.boot:spring-boot-starter-test') {
        exclude(group: 'org.mockito')
    }
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}

...

调查这个问题我发现只有 gradle 本身,lombok 和 jmockit 使用asm可能会导致此异常的库。有人可以回答我是哪个库调用了这个异常吗?

更新

我发现那篇关于同样问题的文章: https://matsumana.info/blog/2018/09/25/gradle-with-jdk11/ 指向这里的 gradle 问题https://github.com/gradle/gradle /issues/5120 所以这意味着 gradle 还不支持 Java 11?

4

4 回答 4

11

Java 11 添加了基于嵌套的访问,因此任何字节码编写 API(如ASM)都必须更新以支持类文件更改。

在 6.2.1 版本的 ASM 中查看该方法的源代码(这是 gradle 似乎正在使用的那个):

  @Deprecated
  public void visitNestMemberExperimental(final String nestMember) {
    if (api < Opcodes.ASM7_EXPERIMENTAL) {
      throw new UnsupportedOperationException();
    }
    if (cv != null) {
      cv.visitNestMemberExperimental(nestMember);
    }
  }

所需的 API 级别为 7,目前处于测试阶段。我猜他们在更新依赖项之前正在等待 ASM 7 的发布版本。

于 2018-10-08T12:51:26.793 回答
7

ASM v7发布

Gradle 问题已关闭,可在Gradle 5.0 RC1或更高版本中获得修复。

二进制文件应该很快就可以下载了。

于 2018-10-29T19:20:10.360 回答
5

Gradle 版本 4.10.3 似乎也解决了它。

于 2019-02-17T10:25:30.987 回答
1

我遇到了这个错误。因为我的 gradle 文件配置了 1.7 jdk,并且在项目设置中我指的是 1.8 jdk。所以我在 gradle 文件中更改为 sourceCompatibility = 1.8 targetCompatibility = 1.8

于 2019-08-04T14:57:53.807 回答