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

Ala*_*lan 15 java android unit-testing gradle

我有一个 android 项目,我无法再在本地运行所有测试 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)
Run Code Online (Sandbox Code Playgroud)

Tun*_*ken 29

这是一个老问题,但对于未来的谷歌搜索者和可能可以解决这个问题的感兴趣的各方,值得一提的是,如果您使用更流行的演练之一来设置 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.*']
}
Run Code Online (Sandbox Code Playgroud)

就我而言:

junitJacoco {
    jacocoVersion = '0.8.4' // type String
    includeInstrumentationCoverageInMergedReport = true // type boolean
    tasks.withType(Test) {
        jacoco.includeNoLocationClasses = true
        jacoco.excludes = ['jdk.internal.*']
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!添加 jacoco.excludes = ['jdk.internal.*'] 就成功了! (5认同)
  • 谢谢它对我有用。另外,您提到的链接无法访问。 (2认同)

Man*_*ddy 23

感谢@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
}

}
Run Code Online (Sandbox Code Playgroud)


小智 5

在这种情况下,即使您的 JAVA_HOME 在 bash_profile 中设置,您也需要在 Android 中进行设置:转到文件 -> 项目结构 -> SDK 位置设置 JDK 位置。

有时,它可能与 bash_profile 位置不同。

请参阅截图以供参考 在此输入图像描述