将 Android Studio 更新到 ArticFox 后运行单元测试时出现 NoClassDefFoundError | 2020.3.1

问题描述 投票:0回答:4

未收到测试事件错误:

将 android studio 更新到 ArticFox 后运行单元测试时出现 NoClassDefFoundError | 2020.3.1.

以下是完整的错误:

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:2180)
at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:493)
at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:451)
at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:122)
at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:69)
at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:68)
at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:73)

Caused by: java.lang.ClassNotFoundException: jdk.internal.reflect.GeneratedSerializationConstructorAccessor1
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
... 11 more

我刚刚下载了最新的 android studio,克隆了一个项目并尝试运行单元测试。

我该如何解决这个问题?我正在使用嵌入式 JDK(Java 11.0)。

android android-studio android-testing android-unit-testing
4个回答
5
投票

这是由于 jacoco 而发生的。最新的 android studio 附带了 Java 11,但我们使用的是 Java 9。进行以下更改修复了它。

jacoco { includeNoLocationClasses = true }

jacoco {
   includeNoLocationClasses = true
   excludes = ['jdk.internal.*'] 
}

2
投票

Android Studio 现在使用 JDK 11。因此,如果您使用的是较低版本的 JDK 和 JaCoCo,这可以是一个解决方案:

您需要将以下行添加到 build.gradle 文件中的 JaCoCo 块中:

excludes = ['jdk.internal.*']

所以,最终的块看起来像这样:

jacoco {
    includeNoLocationClasses = true
    excludes = ['jdk.internal.*']
}

您可以在发行说明中找到原因:

在 Android Studio 中运行时,Gradle 构建工具使用 Studio 捆绑的 JDK。在以前的版本中,JDK 8 与 Studio 捆绑在一起。然而,在 4.2 中,现在捆绑了 JDK 11。当使用新的捆绑 JDK 运行 Gradle 时,由于垃圾收集器的更改,可能会导致一些不兼容或影响 JVM 性能。 AGP 发行说明中描述了这些问题。


1
投票

对于任何想了解 Kotlin 中如何实现的人:

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

0
投票

我解决了这个问题;它与 Android Studio 最新版本有关。所有测试用例都不起作用,解决方案是使用正确的值更新

/.idea/runConfigurations.xml

我找到了解决方案这里

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="RunConfigurationProducerService">
    <option name="ignoredProducers">
      <set>
        <option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
        <option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
        <option value="com.intellij.execution.junit.PatternConfigurationProducer" />
        <option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
        <option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
        <option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
        <option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
        <option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
      </set>
    </option>
  </component>
</project>
© www.soinside.com 2019 - 2024. All rights reserved.