将 Android Studio 更新为 ArticFox 后 运行 单元测试出现 NoClassDefFoundError | 2020.3.1
NoClassDefFoundError on running unit test after updating Android Studio to ArticFox | 2020.3.1
未收到测试事件错误:
NoClassDefFoundError on running unit test after updating android studio to ArticFox | 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 工作室,克隆了一个项目并尝试 运行 单元测试。
我该如何解决这个问题?我正在使用嵌入式 JDK(即 Java 11.0)。
这是由于 jacoco 而发生的。最新的 android studio 附带 Java 11,但我们使用的是 Java 9。进行以下更改修复了它。
jacoco { includeNoLocationClasses = true }
至
jacoco {
includeNoLocationClasses = true
excludes = ['jdk.internal.*']
}
AndroidStudio现在使用JDK11。所以,如果你使用的是JDK和JaCoCo的低版本,可以这样解决:
您需要将以下行添加到 build.gradle 文件中的 JaCoCo 块中:
excludes = ['jdk.internal.*']
所以,最后的块看起来像这样:
jacoco {
includeNoLocationClasses = true
excludes = ['jdk.internal.*']
}
你可以在release note中找到原因:
When running in Android Studio, the Gradle build tool uses Studio's bundled JDK. In previous releases, JDK 8 was bundled with Studio. In 4.2, however, JDK 11 is now bundled instead. When using the new bundled JDK to run Gradle, this may result in some incompatibility or impact JVM performance due to changes to the garbage collector. These issues are described in the AGP release notes.
对于了解 Kotlin 是如何完成的任何人:
tasks.withType<Test> {
extensions.configure(JacocoTaskExtension::class) {
isIncludeNoLocationClasses = true
excludes = listOf("jdk.internal.*")
}
}
未收到测试事件错误:
NoClassDefFoundError on running unit test after updating android studio to ArticFox | 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 工作室,克隆了一个项目并尝试 运行 单元测试。
我该如何解决这个问题?我正在使用嵌入式 JDK(即 Java 11.0)。
这是由于 jacoco 而发生的。最新的 android studio 附带 Java 11,但我们使用的是 Java 9。进行以下更改修复了它。
jacoco { includeNoLocationClasses = true }
至
jacoco {
includeNoLocationClasses = true
excludes = ['jdk.internal.*']
}
AndroidStudio现在使用JDK11。所以,如果你使用的是JDK和JaCoCo的低版本,可以这样解决:
您需要将以下行添加到 build.gradle 文件中的 JaCoCo 块中:
excludes = ['jdk.internal.*']
所以,最后的块看起来像这样:
jacoco {
includeNoLocationClasses = true
excludes = ['jdk.internal.*']
}
你可以在release note中找到原因:
When running in Android Studio, the Gradle build tool uses Studio's bundled JDK. In previous releases, JDK 8 was bundled with Studio. In 4.2, however, JDK 11 is now bundled instead. When using the new bundled JDK to run Gradle, this may result in some incompatibility or impact JVM performance due to changes to the garbage collector. These issues are described in the AGP release notes.
对于了解 Kotlin 是如何完成的任何人:
tasks.withType<Test> {
extensions.configure(JacocoTaskExtension::class) {
isIncludeNoLocationClasses = true
excludes = listOf("jdk.internal.*")
}
}