Gradle-Testaufgaben können aufgrund von java.lang.NoClassDefFoundError nicht ausgeführt werden: jdk/internal/reflect/GeneratedSerializationConstructorAccessor1

Lesezeit: 5 Minuten

Ich habe ein Android-Projekt, bei dem ich nicht mehr alle Test-Gradle-Aufgaben lokal ausführen kann (ich habe drei verschiedene Varianten in diesem Projekt). Ich habe diese Fehlermeldung 50 Mal, bevor die Aufgaben fehlschlagen. Ich habe kein Problem damit, diese Aufgaben remote mit Gitlab CI/CD auszuführen, und ich habe lokal ein anderes Projekt, bei dem ich dieses Problem auch nicht habe.

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)

  • Ich habe genau das gleiche Problem. Haben Sie kürzlich zufällig ein Upgrade auf die neuesten Jetbrains-IDE-Versionen durchgeführt? AS 4.2.1, denke ich

    – davy307

    21. Juni 2021 um 16:24

  • @davy307 Ja, ich habe auch kürzlich Android Studio auf 4.2.1 aktualisiert, kann das Problem jedoch nicht datieren und bin mir daher nicht sicher, ob es damit zusammenhängt

    – Alan

    22. Juni 2021 um 12:42 Uhr

  • Update: Ich habe das Problem auf AS 4.2.1. Dann habe ich es mit der letzten Version von IC 2021.1 versucht, am Anfang hatte Intellij Gradle-Probleme und wollte das Projekt nicht kompilieren. Nachdem ich den Git-Verlauf meines Projekts hin und her durchgegangen bin, wurde das Build-Problem mit IC irgendwie behoben (ohne eine Zeile zu ändern) und ich kann jetzt das Projekt erstellen und die Tests mit IC ausführen. Das Problem bleibt bei AS.

    – Alan

    22. Juni 2021 um 16:26


  • Richtig, nach einiger Untersuchung stellt sich heraus, dass AS 4.2.1 ein Problem hat, bei dem der Verweis auf das JDK verloren geht. Jetzt müssen Sie abhängig von Ihrem Projekt die spezifische JDK-Version von Oracle herunterladen (für unser Projekt habe ich JDK verwendet). 8 (oracle.com/uk/java/technologies/javase/…), da dies die maximal unterstützte Datei ist, und verweisen Sie AS dann im Menü „Projektstruktur“ auf diese als JAVA_HOME

    – davy307

    23. Juni 2021 um 13:08 Uhr

Tungkens Benutzeravatar
Tungken

Dies ist ein altes Problem, aber für zukünftige Google-Sucher und möglicherweise Interessierte, die dieses Problem umgehen könnten, ist es erwähnenswert, dass, wenn Sie eine der bekannteren Komplettlösungen zum Einrichten von JaCoCo + Robolectric + Espresso verwenden: https://medium.com/@rafael_toledo/setting-up-an-unified-coverage-report-in-android-with-jacoco-robolectric-and-espresso-ffe239aaf3fa . Bitte fügen Sie unten Folgendes hinzu:

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

In meinem Fall:

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

  • Danke, es hat bei mir funktioniert. Außerdem ist der von Ihnen genannte Link nicht erreichbar.

    – Vishal Naikawadi

    29. Juli 2021 um 11:21 Uhr

  • Ich habe so lange versucht, das Problem zu beheben, und mein Problem war, dass ich das vergessen habe * Platzhalter am Ende jdk.internal.* 🤦‍♂️

    – Dhananjay Suresh

    9. August 2021 um 21:13 Uhr

  • Danke! Hinzufügen von jacoco.excludes = [‘jdk.internal.*’] hat es geschafft!

    – Sein

    26. August 2021 um 13:39 Uhr


Danke an @Tungken

Ich musste es innen hinzufügen 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
}

}

  • Danke. Bei mir hat es nur funktioniert, als ich es eingefügt habe: testOptions { unitTests.all { jacoco {

    – Arpit Ratan

    13. Okt. 2021 um 9:55 Uhr

  • Diese Lösung funktionierte für mich, aber niemand anderes in meinem Team musste sie hinzufügen – alle konnten die Tests problemlos ausführen, und die Tests liefen auch in Jenkins einwandfrei. Daher möchte ich diese Änderung nicht in mein Repo übernehmen. Weiß jemand, warum nur ich diese Änderung vornehmen muss? Es muss etwas geben, das ich lokal ändern kann, sodass ich das nicht tun muss.

    – elliptisch1

    30. Dezember 2021 um 16:23 Uhr

  • @elliptic1 Ich habe genau das gleiche Problem. Haben Sie eine Lösung gefunden?

    – immer

    8. März 2022 um 14:47 Uhr

  • @elliptic1 Stellen Sie sicher, dass die Java-Version in Ihrem Pfad mit der Ihrer Kollegen übereinstimmt (das war mein Problem).

    – Kevin Brotcke

    31. März 2022 um 20:01 Uhr

Benutzeravatar von Nikita Baronia
Nikita Baronia

In einem solchen Fall müssen Sie, auch wenn Ihr JAVA_HOME in bash_profile festgelegt ist, dies auch in Android festlegen: Gehen Sie zu Datei -> Projektstruktur -> SDK-Speicherort und legen Sie den JDK-Speicherort fest.

Manchmal kann es sich um einen anderen Speicherort als bash_profile handeln.

Siehe Screenshot als Referenz
Geben Sie hier eine Bildbeschreibung ein

  • Das hat bei mir funktioniert! Ich habe mein JDK von 11 auf 8 geändert und kann die Tests jetzt lokal ausführen. Danke!

    – Joaquin Iurchuk

    22. März 2022 um 23:03 Uhr


Für alle, die wissen möchten, wie der Fix in Kotlin aussieht *.kts:

tasks.withType<Test> {
    extensions.configure(JacocoTaskExtension::class) {
        isIncludeNoLocationClasses = true
        excludes = listOf("jdk.internal.*")
    }
}

Für alle, die wissen möchten, wie das Update für Kotlin DSL aussieht – funktionierende Lösung:

import com.android.build.gradle.BaseExtension
import org.gradle.kotlin.dsl.configure
import org.gradle.testing.jacoco.plugins.JacocoTaskExtension

configure<BaseExtension> {
    testOptions {
        unitTests {
            all { test ->
                test.extensions.configure<JacocoTaskExtension> {
                    excludes = listOf("jdk.internal.*")
                }
            }
        }
    }
}

1452450cookie-checkGradle-Testaufgaben können aufgrund von java.lang.NoClassDefFoundError nicht ausgeführt werden: jdk/internal/reflect/GeneratedSerializationConstructorAccessor1

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy