有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

由于java,安卓无法运行gradle测试任务。lang.NoClassDefFoundError:jdk/internal/reflect/GeneratedSerializationConstructorAccessor1

我有一个安卓项目,我不能再在本地运行所有的测试gradle任务(在这个项目中我有3种不同的风格)。在任务失败之前,我有50次此错误消息。我用Gitlab CI/CD远程运行这些任务没有问题,我在本地有另一个项目,我也没有这个问题

java.lang.NoClassDefFoundError: jdk/internal/reflect/GeneratedSerializationConstructorAccessor1
    at jdk.internal.reflect.GeneratedSerializationConstructorAccessor1.newInstance(Unknown Source)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at java.base/java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:1092)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2150)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1668)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:482)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:440)
    at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.deserializeWorker(SystemApplicationClassLoaderWorker.java:153)
    at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121)
    at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71)
    at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69)
    at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74)

共 (3) 个答案

  1. # 1 楼答案

    这是一个老问题,但对于未来的谷歌搜索者和可能解决这一问题的感兴趣的各方来说,值得一提的是,如果您正在使用一种更流行的步行方式来设置JaCoCo+Robolectric+Espresso-https://medium.com/@rafael_toledo/setting-up-an-unified-coverage-report-in-android-with-jacoco-robolectric-and-espresso-ffe239aaf3fa。请添加以下内容:

    tasks.withType(Test) {
        jacoco.includeNoLocationClasses = true
        jacoco.excludes = ['jdk.internal.*']
    }
    

    就我而言:

    junitJacoco {
        jacocoVersion = '0.8.4' // type String
        includeInstrumentationCoverageInMergedReport = true // type boolean
        tasks.withType(Test) {
            jacoco.includeNoLocationClasses = true
            jacoco.excludes = ['jdk.internal.*']
        }
    }
    
  2. # 2 楼答案

    在这种情况下,即使您的JAVA_主页是在bash_配置文件中设置的,您也需要在Android中设置,以便: 转到文件->;项目结构->;SDK位置 设置JDK位置

    有时,它可能位于与bash_profile one不同的位置

    请参阅屏幕截图以供参考 enter image description here

  3. # 3 楼答案

    感谢@Tungken

    我不得不把它添加到testOptions { unitTests.all { jacoco {

    android {
      compileSdk 30
      buildToolsVersion "30.0.3"
    
      defaultConfig {
     
         ...
    
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
           
        }
        debug {
            testCoverageEnabled true
            debuggable true
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
    kotlinOptions {
        jvmTarget = '11'
    }
    
    testOptions {
        unitTests.all {
            jacoco {
                includeNoLocationClasses = true
                excludes = ['jdk.internal.*']       //This line
            }
        }
        unitTests.returnDefaultValues = true
    }
    
    }