[英]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.