简体   繁体   English

Gradle 使用 JaCoCo 插件和 Java 15 测试失败?

[英]Gradle test fails using the JaCoCo plugin with Java 15?

This problem appears to be mentioned in https://github.com/gradle/gradle/issues/15038 , but it is unclear from that thread how to fix it so posting it here. https://github.com/gradle/gradle/issues/15038中似乎提到了这个问题,但是从该线程中不清楚如何解决它,所以在这里发布。 I'm running Java 15:我正在运行 Java 15:

> java --version
openjdk 15.0.2 2021-01-19

and Gradle 6.6.1:和 Gradle 6.6.1:

> gradle --version

------------------------------------------------------------
Gradle 6.6.1
------------------------------------------------------------

Build time:   2020-08-25 16:29:12 UTC
Revision:     f2d1fb54a951d8b11d25748e4711bec8d128d7e3

Kotlin:       1.3.72
Groovy:       2.5.12
Ant:          Apache Ant(TM) version 1.10.8 compiled on May 10 2020
JVM:          14.0.1 (Oracle Corporation 14.0.1+14)
OS:           Mac OS X 10.16 x86_64

I've started a test project selecting Application as its type, and added the jacoco plugin:我已经开始了一个选择Application作为其类型的测试项目,并添加了jacoco插件:

plugins {
    // Apply the java plugin to add support for Java
    id 'java'

    // Apply the application plugin to add support for building a CLI application.
    id 'application'

    id 'jacoco'
}

However, if I try to ./gradlew test I get the following error:但是,如果我尝试./gradlew test我会收到以下错误:

> ./gradlew test

> Task :test
java.lang.instrument.IllegalClassFormatException: Error while instrumenting sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo.
        at org.jacoco.agent.rt.internal_43f5073.CoverageTransformer.transform(CoverageTransformer.java:94)
        at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:246)
        at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
        at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:563)
        at java.base/java.lang.ClassLoader.defineClass2(Native Method)
        at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1108)
        at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:183)
        at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:784)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:705)
        at java.base/jdk.internal.loader.BuiltinClassLoader.findClass(BuiltinClassLoader.java:586)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:634)
        at java.base/java.lang.Class.forName(Class.java:546)
        at java.base/java.util.ServiceLoader.loadProvider(ServiceLoader.java:854)
        at java.base/java.util.ServiceLoader$ModuleServicesLookupIterator.hasNext(ServiceLoader.java:1078)
        at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1301)
        at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1386)
        at java.base/sun.util.cldr.CLDRLocaleProviderAdapter$1.run(CLDRLocaleProviderAdapter.java:89)
        at java.base/sun.util.cldr.CLDRLocaleProviderAdapter$1.run(CLDRLocaleProviderAdapter.java:86)
        at java.base/java.security.AccessController.doPrivileged(AccessController.java:554)
        at java.base/sun.util.cldr.CLDRLocaleProviderAdapter.<init>(CLDRLocaleProviderAdapter.java:86)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:64)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
        at java.base/sun.util.locale.provider.LocaleProviderAdapter.forType(LocaleProviderAdapter.java:188)
        at java.base/sun.util.locale.provider.LocaleProviderAdapter.findAdapter(LocaleProviderAdapter.java:287)
        at java.base/sun.util.locale.provider.LocaleProviderAdapter.getAdapter(LocaleProviderAdapter.java:258)
        at java.base/java.util.Calendar.createCalendar(Calendar.java:1693)
        at java.base/java.util.Calendar.getInstance(Calendar.java:1661)
        at java.base/java.text.SimpleDateFormat.initializeCalendar(SimpleDateFormat.java:677)
        at java.base/java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:621)
        at java.base/java.text.SimpleDateFormat.<init>(SimpleDateFormat.java:600)
        at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.getLastResortErrorLogFile(SystemApplicationClassLoaderWorker.java:162)
        at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:111)
        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)
Caused by: java.io.IOException: Error while instrumenting sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo.
        at org.jacoco.agent.rt.internal_43f5073.core.instr.Instrumenter.instrumentError(Instrumenter.java:159)
        at org.jacoco.agent.rt.internal_43f5073.core.instr.Instrumenter.instrument(Instrumenter.java:109)
        at org.jacoco.agent.rt.internal_43f5073.CoverageTransformer.transform(CoverageTransformer.java:92)
        ... 37 more
Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 59
        at org.jacoco.agent.rt.internal_43f5073.asm.ClassReader.<init>(ClassReader.java:195)
        at org.jacoco.agent.rt.internal_43f5073.asm.ClassReader.<init>(ClassReader.java:176)
        at org.jacoco.agent.rt.internal_43f5073.asm.ClassReader.<init>(ClassReader.java:162)
        at org.jacoco.agent.rt.internal_43f5073.core.internal.instr.InstrSupport.classReaderFor(InstrSupport.java:280)
        at org.jacoco.agent.rt.internal_43f5073.core.instr.Instrumenter.instrument(Instrumenter.java:75)
        at org.jacoco.agent.rt.internal_43f5073.core.instr.Instrumenter.instrument(Instrumenter.java:107)
        ... 38 more

BUILD SUCCESSFUL in 1s
3 actionable tasks: 3 executed

The aforementioned GitHub issues page seems to say that it's possible to solve this error by specifying the toolVersion of the jacoco project extension ( https://docs.gradle.org/6.7/userguide/jacoco_plugin.html#sec:configuring_the_jacoco_plugin ), but it's unclear to me which tool version to choose; The aforementioned GitHub issues page seems to say that it's possible to solve this error by specifying the toolVersion of the jacoco project extension ( https://docs.gradle.org/6.7/userguide/jacoco_plugin.html#sec:configuring_the_jacoco_plugin ), but it's我不清楚选择哪个工具版本; I've tried我试过了

jacoco {
    toolVersion "0.8.5"
}

but with the same error result.但具有相同的错误结果。 Any idea how to fix this error?知道如何解决此错误吗?

A search for "jacoco java 15" brought up the changelog as the first result.搜索“jacoco java 15”时,第一个结果是更新日志

Snapshot Build 0.8.7.202101150304 (2021/01/15)...快照构建 0.8.7.202101150304 (2021/01/15)...

  • JaCoCo now officially supports Java 15 JaCoCo现在正式支持Java 15

Experimental support for Java 15 is listed for JaCoCo 0.8.6. JaCoCo 0.8.6 列出了对 Java 15 的实验性支持。

I ended up solving this by upgrading Gradle from 6.6.1 to 6.8.1 and following the caveats:我最终通过将 Gradle 从 6.6.1 升级到 6.8.1 并遵循警告解决了这个问题:

> brew upgrade gradle
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/cask and homebrew/services).
==> New Casks
decloner               gdat                   mathinspector          vine-server            wolfram-engine         xcodes                 yesplaymusic
==> Updated Casks
Updated 116 casks.
==> Deleted Casks
archi                                                                           barxtemp

==> Upgrading 1 outdated package:
gradle 6.6.1 -> 6.8.1
==> Upgrading gradle 6.6.1 -> 6.8.1 
==> Downloading https://artifacts.apple.com/brew-bottles-core-binaries-local/homebrew-core/openjdk/8feee23f/openjdk-15.0.1.big_sur.bottle.2.tar.gz
######################################################################## 100.0%
==> Downloading https://services.gradle.org/distributions/gradle-6.8.1-all.zip
==> Downloading from https://downloads.gradle-dn.com/distributions/gradle-6.8.1-all.zip
######################################################################## 100.0%
==> Installing dependencies for gradle: openjdk
==> Installing gradle dependency: openjdk
==> Pouring openjdk-15.0.1.big_sur.bottle.2.tar.gz
==> Caveats
For the system Java wrappers to find this JDK, symlink it with
  sudo ln -sfn /opt/brew/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk

openjdk is keg-only, which means it was not symlinked into /opt/brew,
because it shadows the macOS `java` wrapper.

If you need to have openjdk first in your PATH run:
  echo 'set -g fish_user_paths "/opt/brew/opt/openjdk/bin" $fish_user_paths' >> ~/.config/fish/config.fish

For compilers to find openjdk you may need to set:
  set -gx CPPFLAGS "-I/opt/brew/opt/openjdk/include"

Now if I gradle init an application project and add the jacoco plugin,现在如果我gradle init一个application项目并添加jacoco插件,

plugins {
    // Apply the application plugin to add support for building a CLI application in Java.
    id 'application'

    id 'jacoco'
}

./gradlew test succeeds: ./gradlew test成功:

> ./gradlew test

BUILD SUCCESSFUL in 556ms
3 actionable tasks: 3 up-to-date

By also defining dependencies between code coverage reports and test execution,通过定义代码覆盖率报告和测试执行之间的依赖关系,

test {
    finalizedBy jacocoTestReport
}
jacocoTestReport {
    dependsOn test
}

I'm able to view the code coverage report at app/build/reports/jacoco/test/html/index.html after running the test:运行测试后,我可以在app/build/reports/jacoco/test/html/index.html查看代码覆盖率报告:

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM