LinkageError: CLDRLocaleDataMetaInfo with JDK 14 Project Loom build.

248 views
Skip to first unread message

Dávid Karnok

unread,
Jul 31, 2019, 1:21:21 PM7/31/19
to JaCoCo and EclEmma Users
Hi!

I'm experimenting with the Project Loom build (http://jdk.java.net/loom/) using a small gradle project that uses TestNG:


If I enable Jacoco and run "check", I get a hefty exception (on Windows):

java.lang.LinkageError: loader 'platform' attempted duplicate class definition for sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo. (sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo is in module jdk.localedata of loader 'platform')


Caused by: java.util.ServiceConfigurationError: sun.util.locale.provider.LocaleDataMetaInfo: Unable to load sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo
	at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:583)
	at java.base/java.util.ServiceLoader.loadProvider(ServiceLoader.java:855)
	at java.base/java.util.ServiceLoader$ModuleServicesLookupIterator.hasNext(ServiceLoader.java:1077)
	at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1300)
	at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1385)
	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:553)
	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:62)
	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.ReflectAccess.newInstance(ReflectAccess.java:166)
	at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:404)
	at java.base/java.lang.Class.newInstance(Class.java:591)
	at java.base/sun.util.locale.provider.LocaleProviderAdapter.forType(LocaleProviderAdapter.java:176)
	at java.base/sun.util.locale.provider.LocaleProviderAdapter.findAdapter(LocaleProviderAdapter.java:279)
	at java.base/sun.util.locale.provider.LocaleProviderAdapter.getAdapter(LocaleProviderAdapter.java:250)
	at java.base/java.text.DecimalFormatSymbols.getInstance(DecimalFormatSymbols.java:180)
	at java.base/java.util.Formatter.getZero(Formatter.java:2437)
	at java.base/java.util.Formatter.<init>(Formatter.java:1956)
	at java.base/java.util.Formatter.<init>(Formatter.java:1978)
	at java.base/java.lang.String.format(String.java:3274)
	at org.testng.internal.Utils.<clinit>(Utils.java:32)
	at org.testng.TestNG.setOutputDirectory(TestNG.java:217)
	at org.gradle.api.internal.tasks.testing.testng.TestNGTestClassProcessor.runTests(TestNGTestClassProcessor.java:102)
	at org.gradle.api.internal.tasks.testing.testng.TestNGTestClassProcessor.stop(TestNGTestClassProcessor.java:89)
	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
	... 25 more
Caused by: java.lang.LinkageError: loader 'platform' attempted duplicate class definition for sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo. (sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo is in module jdk.localedata of loader 'platform')
	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:782)
	at java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:703)
	at java.base/jdk.internal.loader.BuiltinClassLoader.findClass(BuiltinClassLoader.java:584)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:633)
	at java.base/java.lang.Class.forName(Class.java:492)
	at java.base/java.util.ServiceLoader.loadProvider(ServiceLoader.java:853)
	... 52 more


Is there a setting I'm missing that could cause this problem?

Thank you for your time.

Evgeny Mandrikov

unread,
Jul 31, 2019, 3:46:42 PM7/31/19
to JaCoCo and EclEmma Users
Hi,

By doing

testLogging.events=["skipped", "failed"]

you're hiding standard error output.

After change on

testLogging.events=["skipped", "failed", "standard_error"]

you'll see root cause, which for some reason gets lost and not preserved in exception that you currently see

Gradle Test Executor 8 STANDARD_ERROR
    java.lang.instrument.IllegalClassFormatException: Error while instrumenting sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo.
        at org.jacoco.agent.rt.internal_035b120.CoverageTransformer.transform(CoverageTransformer.java:93)
    Caused by: java.io.IOException: Error while instrumenting sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo.
        at org.jacoco.agent.rt.internal_035b120.core.instr.Instrumenter.instrumentError(Instrumenter.java:158)
        at org.jacoco.agent.rt.internal_035b120.core.instr.Instrumenter.instrument(Instrumenter.java:108)
        at org.jacoco.agent.rt.internal_035b120.CoverageTransformer.transform(CoverageTransformer.java:91)
        ... 64 more
    Caused by: java.lang.IllegalArgumentException: Unsupported class file major version 58
 

Warning: This build is based on an incomplete version of JDK 14. 

JDK 14 contains class files with major version 58 (Java 14 bytecode) and sun/util/resources/cldr/provider/CLDRLocaleDataMetaInfo is one of them,
whereas JaCoCo 0.8.4 does not support instrumentation of Java 14 bytecode - see https://www.jacoco.org/jacoco/trunk/doc/changes.html :
official support for instrumentation of Java 12 bytecode since version 0.8.4,
and experimental support for instrumentation of Java 13 bytecode since version 0.8.3.

Your class files compiled into Java 11 bytecode,
and you probably not interested in coverage of any other class files,
so you can include only them into instrumentation by addition to testng task

jacoco.includes = ["hu/akarnokd/**"]

Or you can try unreleased JaCoCo version 0.8.5-SNAPSHOT ( https://www.jacoco.org/jacoco/trunk/doc/repo.html ) that contains experimental support for instrumentation of Java 14 bytecode ( https://github.com/jacoco/jacoco/pull/897 ).


Regards,
Evgeny

Dávid Karnok

unread,
Jul 31, 2019, 11:54:36 PM7/31/19
to jac...@googlegroups.com
Thanks, it works now. It is always a risk of trying out new stuff knowing that tool support will be lacking and one can only hope for such workarounds.

--
You received this message because you are subscribed to a topic in the Google Groups "JaCoCo and EclEmma Users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/jacoco/C0Oa6otd894/unsubscribe.
To unsubscribe from this group and all its topics, send an email to jacoco+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jacoco/ae033714-ba6c-4480-835a-386ede4968dc%40googlegroups.com.
Reply all
Reply to author
Forward
This conversation is locked
You cannot reply and perform actions on locked conversations.
0 new messages