【问题标题】:Cannot run gradle test tasks because of java.lang.NoClassDefFoundError: jdk/internal/reflect/GeneratedSerializationConstructorAccessor1由于 java.lang.NoClassDefFoundError: jdk/internal/reflect/GeneratedSerializationConstructorAccessor1 无法运行 gradle 测试任务
【发布时间】:2021-09-04 23:54:57
【问题描述】:

我有一个 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)

【问题讨论】:

  • 我遇到了完全相同的问题,您最近是否有机会升级到最新的 Jetbrains IDE 版本? AS 4.2.1 我认为
  • @davy307 是的,我最近也将 Android Studio 更新到了 4.2.1,但我无法确定问题的日期,所以我不确定这是否相关
  • 更新:我在 AS 4.2.1 上遇到了问题。然后我尝试了最后一个版本的 IC 2021.1,一开始 intellij 有 gradle 问题,不想编译项目。在我的项目的 git 历史来回查看之后,它以某种方式修复了 IC 的构建问题(无需更改一行),我现在可以构建项目并使用 IC 运行测试。问题仍然存在于 AS。
  • 对,所以经过一番调查,发现AS 4.2.1 有一个问题,它丢失了对JDK 的引用,现在,根据您的项目,您需要下载特定的JDK 版本来自 oracle(对于我们来说,我使用了 JDK 8 (oracle.com/uk/java/technologies/javase/…),因为这是支持的最大值,然后在 Project Structure 菜单下将 AS 指向它作为它的 JAVA_HOME

标签: java android unit-testing gradle


【解决方案1】:

对于任何想在 Kotlin 中查看修复的人*.kts

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢。对我来说,它只有在我将它添加到里面时才有效:testOptions { unitTests.all { jacoco {
    • 这个解决方案对我有用,但我的团队中没有其他人需要添加它 - 他们都可以很好地运行测试,并且测试在 Jenkins 中也运行良好。因此,我不想将此更改提交给我的仓库。有谁知道为什么只有我需要做这个改变?必须有一些我可以在本地更改的东西,所以我不需要这样做。
    【解决方案3】:

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

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

    参考截图

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 感谢它对我有用。另外,您提到的链接无法访问。
      • 花了很长时间试图解决这个问题,我的问题是我忘记了jdk.internal.* 末尾的* 通配符?‍♂️
      • 它也对我有用。谢谢!
      • 谢谢!添加 jacoco.excludes = ['jdk.internal.*'] 成功了!
      • 在这里工作。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-09
      • 2014-07-11
      • 1970-01-01
      • 2019-07-08
      • 2022-07-24
      相关资源
      最近更新 更多