Eclipse:使用 Coverage 进行测试会抛出 java.lang.instrument.IllegalClassFormatException

Posted

技术标签:

【中文标题】Eclipse:使用 Coverage 进行测试会抛出 java.lang.instrument.IllegalClassFormatException【英文标题】:Eclipse: Testing with Coverage throws java.lang.instrument.IllegalClassFormatException 【发布时间】:2021-02-18 02:54:49 【问题描述】:

我最近在我的 Eclipse 设置中更改了一些东西,主要是我将 Java 版本从 8 升级到了 15,我花了一段时间才注意到,但是我不能再在我的任何项目上使用 Coverage 进行测试,因为它会抛出一个带有巨大 StackTrace 的 java.lang.instrument.IllegalClassFormatException。

它还给出了一个弹出错误,上面写着“没有使用测试运行器 'Junit5' 找到测试” Java 库中的某处、Junit 或某些东西一定是坏了,我无法弄清楚它是什么。正常测试、调试测试甚至 Maven 测试所有功能都正常,没有任何错误迹象。

这是 Junit 故障跟踪:

java.util.ServiceConfigurationError:无法实例化语言环境提供程序适配器“CLDR”。 在 java.base/sun.util.locale.provider.LocaleProviderAdapter.forType(LocaleProviderAdapter.java:199) 在 java.base/sun.util.locale.provider.LocaleProviderAdapter.findAdapter(LocaleProviderAdapter.java:287) 在 java.base/sun.util.locale.provider.LocaleProviderAdapter.getAdapter(LocaleProviderAdapter.java:258) 在 java.base/java.text.DecimalFormatSymbols.getInstance(DecimalFormatSymbols.java:180) 在 java.base/java.util.Formatter.getZero(Formatter.java:2437) 在 java.base/java.util.Formatter.(Formatter.java:1956) 在 java.base/java.util.Formatter.(Formatter.java:1978) 在 java.base/java.lang.String.format(String.java:3292) 在 org.junit.runner.Description.formatDisplayName(Description.java:114) 在 org.junit.runner.Description.createTestDescription(Description.java:86) 在 org.junit.runners.BlockJUnit4ClassRunner.describeChild(BlockJUnit4ClassRunner.java:121) 在 org.junit.runners.BlockJUnit4ClassRunner.describeChild(BlockJUnit4ClassRunner.java:63) 在 org.junit.runners.ParentRunner.getDescription(ParentRunner.java:401) 在 org.junit.runners.model.RunnerBuilder.configureRunner(RunnerBuilder.java:81) 在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:72) 在 org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:37) 在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70) 在 org.junit.internal.requests.ClassRequest.createRunner(ClassRequest.java:28) 在 org.junit.internal.requests.MemoizingRequest.getRunner(MemoizingRequest.java:19) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:90) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:76) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:526) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210) 引起:java.lang.reflect.InvocationTargetException 在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64) 在 java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) 在 java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481) 在 java.base/sun.util.locale.provider.LocaleProviderAdapter.forType(LocaleProviderAdapter.java:188) ... 25 更多 原因:java.util.ServiceConfigurationError: sun.util.locale.provider.LocaleDataMetaInfo: Unable to load sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo 在 java.base/java.util.ServiceLoader.fail(ServiceLoader.java:584) 在 java.base/java.util.ServiceLoader.loadProvider(ServiceLoader.java:856) 在 java.base/java.util.ServiceLoader$ModuleServicesLookupIterator.hasNext(ServiceLoader.java:1078) 在 java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1301) 在 java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1386) 在 java.base/sun.util.cldr.CLDRLocaleProviderAdapter$1.run(CLDRLocaleProviderAdapter.java:89) 在 java.base/sun.util.cldr.CLDRLocaleProviderAdapter$1.run(CLDRLocaleProviderAdapter.java:86) 在 java.base/java.security.AccessController.doPrivileged(AccessController.java:554) 在 java.base/sun.util.cldr.CLDRLocaleProviderAdapter.(CLDRLocaleProviderAdapter.java:86) ... 31 更多 原因:java.lang.LinkageError: loader 'platform' 尝试了 sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo 的重复类定义。 (sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo 在加载器“平台”的模块 jdk.localedata 中) 在 java.base/java.lang.ClassLoader.defineClass2(本机方法) 在 java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1108) 在 java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:183) 在 java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:784) 在 java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:705) 在 java.base/jdk.internal.loader.BuiltinClassLoader.findClass(BuiltinClassLoader.java:586) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:634) 在 java.base/java.lang.Class.forName(Class.java:546) 在 java.base/java.util.ServiceLoader.loadProvider(ServiceLoader.java:854) ... 38 更多

这里是控制台 StackTrace:

java.lang.instrument.IllegalClassFormatException:检测 sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo 时出错。 在 org.jacoco.agent.rt.internal_43f5073.CoverageTransformer.transform(CoverageTransformer.java:94) 在 java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246) 在 java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188) 在 java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:563) 在 java.base/java.lang.ClassLoader.defineClass2(本机方法) 在 java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1108) 在 java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:183) 在 java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:784) 在 java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:705) 在 java.base/jdk.internal.loader.BuiltinClassLoader.findClass(BuiltinClassLoader.java:586) 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:634) 在 java.base/java.lang.Class.forName(Class.java:546) 在 java.base/java.util.ServiceLoader.loadProvider(ServiceLoader.java:854) 在 java.base/java.util.ServiceLoader$ModuleServicesLookupIterator.hasNext(ServiceLoader.java:1078) 在 java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1301) 在 java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1386) 在 java.base/sun.util.cldr.CLDRLocaleProviderAdapter$1.run(CLDRLocaleProviderAdapter.java:89) 在 java.base/sun.util.cldr.CLDRLocaleProviderAdapter$1.run(CLDRLocaleProviderAdapter.java:86) 在 java.base/java.security.AccessController.doPrivileged(AccessController.java:554) 在 java.base/sun.util.cldr.CLDRLocaleProviderAdapter.(CLDRLocaleProviderAdapter.java:86) 在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64) 在 java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) 在 java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481) 在 java.base/sun.util.locale.provider.LocaleProviderAdapter.forType(LocaleProviderAdapter.java:188) 在 java.base/sun.util.locale.provider.LocaleProviderAdapter.findAdapter(LocaleProviderAdapter.java:287) 在 java.base/sun.util.locale.provider.LocaleProviderAdapter.getAdapter(LocaleProviderAdapter.java:258) 在 java.base/java.text.DecimalFormatSymbols.getInstance(DecimalFormatSymbols.java:180) 在 java.base/java.util.Formatter.getZero(Formatter.java:2437) 在 java.base/java.util.Formatter.(Formatter.java:1956) 在 java.base/java.util.Formatter.(Formatter.java:1978) 在 java.base/java.lang.String.format(String.java:3292) 在 org.junit.runner.Description.formatDisplayName(Description.java:114) 在 org.junit.runner.Description.createTestDescription(Description.java:86) 在 org.junit.runners.BlockJUnit4ClassRunner.describeChild(BlockJUnit4ClassRunner.java:121) 在 org.junit.runners.BlockJUnit4ClassRunner.describeChild(BlockJUnit4ClassRunner.java:63) 在 org.junit.runners.ParentRunner.getDescription(ParentRunner.java:401) 在 org.junit.runners.model.RunnerBuilder.configureRunner(RunnerBuilder.java:81) 在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:72) 在 org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:37) 在 org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:70) 在 org.junit.internal.requests.ClassRequest.createRunner(ClassRequest.java:28) 在 org.junit.internal.requests.MemoizingRequest.getRunner(MemoizingRequest.java:19) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:90) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:76) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:526) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210) 原因:java.io.IOException:检测 sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo 时出错。 在 org.jacoco.agent.rt.internal_43f5073.core.instr.Instrumenter.instrumentError(Instrumenter.java:159) 在 org.jacoco.agent.rt.internal_43f5073.core.instr.Instrumenter.instrument(Instrumenter.java:109) 在 org.jacoco.agent.rt.internal_43f5073.CoverageTransformer.transform(CoverageTransformer.java:92) ... 50 更多 引起:java.lang.IllegalArgumentException:不支持的类文件主要版本 59 在 org.jacoco.agent.rt.internal_43f5073.asm.ClassReader.(ClassReader.java:195) 在 org.jacoco.agent.rt.internal_43f5073.asm.ClassReader.(ClassReader.java:176) 在 org.jacoco.agent.rt.internal_43f5073.asm.ClassReader.(ClassReader.java:162) 在 org.jacoco.agent.rt.internal_43f5073.core.internal.instr.InstrSupport.classReaderFor(InstrSupport.java:280) 在 org.jacoco.agent.rt.internal_43f5073.core.instr.Instrumenter.instrument(Instrumenter.java:75) 在 org.jacoco.agent.rt.internal_43f5073.core.instr.Instrumenter.instrument(Instrumenter.java:107) ... 51 更多

我觉得 Stack Trace 的奇怪之处在于它似乎尝试使用 Junit4,尽管事实上我在 Eclipse 中的更改前​​后都使用了 5,但这是我唯一能读出的东西它。

是否有人知道我的 Eclipse 中的哪个设置损坏或帮助我解码 StackTrace?

【问题讨论】:

代码覆盖率尚不支持 Java 15。使用 Java 13 或更低版本(Java 8 和 11 是唯一长期支持的)代码覆盖率。 【参考方案1】:

尝试使用 Java 11 或 java 1.8.281 JaCoCo 0.8.5版

【讨论】:

您能否详细说明为什么这些版本的 Java 或 JaCoCo 都可以解决问题中的问题? 这是基于我的试错测试。仍在寻找实际的解决方案

以上是关于Eclipse:使用 Coverage 进行测试会抛出 java.lang.instrument.IllegalClassFormatException的主要内容,如果未能解决你的问题,请参考以下文章

junit覆盖率问题

将 PCOV 与 --coverage 一起使用时,代码接收测试失败

使用coverage工具统计python单元测试覆盖率

使用 karma-coverage 和 angularjs 对每个源文件进行代码覆盖

从 coverage.py 运行测试与从测试运行器运行覆盖

Eclipse下代码字体背景变红/变绿/变黄原因