Переход на Java 11 с помощью gradle; UnsupportedOperationException

Пытаюсь переключиться с 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 еще не поддерживает Java 11?


person Viktor V.    schedule 08.10.2018    source источник
comment
Похоже, что gradle все еще нужно обновить до последней версии asm. Я обнаружил похожую проблему здесь: github.com/gradle/gradle/issues/7059   -  person Jorn Vernee    schedule 08.10.2018
comment
Я думаю, что ломбок тоже не поддерживает Java 11.   -  person voucher_wolves    schedule 08.10.2018


Ответы (4)


В Java 11 добавлен доступ на основе вложений, поэтому любые API для записи байтового кода, такие как ASM необходимо было обновить для поддержки изменений файла классов.

Изучив исходный код этого метода в версии ASM 6.2.1 (который, похоже, использует 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 перед обновлением зависимости.

person Jorn Vernee    schedule 08.10.2018

ASM v7 был выпущен.

Gradle проблема закрыта, и ее исправление доступно по адресу Gradle 5.0 RC1 или новее.

Двоичные файлы скоро будут доступны для загрузки.

person Mikhail Kholodkov    schedule 29.10.2018
comment
Спасибо за уведомление! Проверим это - person Viktor V.; 30.10.2018

Версия Gradle 4.10.3, похоже, тоже решает эту проблему.

person Horcrux7    schedule 17.02.2019

Я столкнулся с этой ошибкой. Поскольку мой файл gradle был настроен с использованием 1.7 jdk, а в настройках проекта я имел в виду 1.8 jdk. поэтому я изменил файл Gradle на sourceCompatibility = 1.8 targetCompatibility = 1.8

person Rajesh B    schedule 04.08.2019