使用 gradle 迁移到 Java 11;不支持的操作异常

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/52701608/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 00:35:12  来源:igfitidea点击:

Migrate to Java 11 with gradle; UnsupportedOperationException

javagradlejava-11

提问by Viktor V.

Trying to switch from jdk 10 to 11 and cannot figure out what library invoke this exception:

试图从 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)

I'm using gradle wrapper(v4.10.2) with the following build.gradle:

我正在使用具有以下内容的 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}"
    }
}

...

Investigating this problem I have figure out only that gradle itself, lombok and jmockit uses asmlibrary which probably can cause this exception. Could someone answer me what library invoke this exception?

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

UPDATE

更新

I have found that article about the same problem: https://matsumana.info/blog/2018/09/25/gradle-with-jdk11/which point to the gradle issue here https://github.com/gradle/gradle/issues/5120So it means gradle still not support Java 11 yet?

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

采纳答案by Jorn Vernee

Java 11 added nest based access, so any byte code writing APIs like ASMhad to be updated to support the class-file changes.

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

Looking at the source code for that method in the 6.2.1 version of ASM (which is the one that gradle seems to be using):

查看 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);
    }
  }

The API level required is 7 which is currently in beta. I guess they are waiting for a release version of ASM 7 before updating the dependency.

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

回答by Mikhail Kholodkov

ASM v7has been released.

ASM v7已经发布

Gradleissuehas been closed and fix is available at Gradle 5.0 RC1or later.

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

Binaries should be soon available for download.

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

回答by Horcrux7

Gradle version 4.10.3 seems also to solve it.

Gradle 4.10.3 版似乎也解决了。

回答by Rajesh B

I faced this error. Because my gradle file was configured with 1.7 jdk and in project settings i was referring to 1.8 jdk. so i changed in gradle file to sourceCompatibility = 1.8 targetCompatibility = 1.8

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