代码之家  ›  专栏  ›  技术社区  ›  Viktor M.

用gradle迁移到java11;不支持操作异常

  •  8
  • Viktor M.  · 技术社区  · 6 年前

    正在尝试从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包装器(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/ 这就指向了格雷德尔的问题 https://github.com/gradle/gradle/issues/5120 这意味着gradle还不支持Java11?

    3 回复  |  直到 6 年前
        1
  •  10
  •   Jorn Vernee    6 年前

    添加Java 11 nest based access ,所以任何字节码编写的API ASM 必须更新以支持类文件更改。

    查看ASM 6.2.1版本中该方法的源代码( which is the one that gradle seems to be using ):

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

    所需的API级别为7,目前处于测试阶段。我猜他们正在等待asm7的发布版本,然后再更新依赖关系。

        2
  •  7
  •   Mikhail Kholodkov    6 年前

    已经 released

    格拉德尔 issue 已关闭,修复程序位于 渐变5.0 RC1 或者更晚。

    二进制文件应该很快就可以用于 download .

        3
  •  5
  •   Horcrux7    5 年前

    Gradle4.10.3版本似乎也解决了这个问题。

        4
  •  1
  •   Rajesh B    5 年前

    我面对这个错误。因为我的gradle文件是用1.7jdk配置的,在项目设置中我指的是1.8jdk。 源兼容性=1.8 目标兼容性=1.8