无法加载 sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo

问题描述 投票:0回答:5

我在我的一项测试中开始遇到一个相当神秘的错误。 Surefire报告如下:

-------------------------------------------------------------------------------
Test set: de.systel.streckenmatching.GeoCoordinateTest
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.129 sec <<< FAILURE!
de.systel.streckenmatching.GeoCoordinateTest  Time elapsed: 0.128 sec  <<< ERROR!
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:584)
    at java.base/java.util.ServiceLoader.loadProvider(ServiceLoader.java:856)
    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: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:124)
    at java.base/jdk.internal.reflect.ReflectionFactory.newInstance(ReflectionFactory.java:346)
    at java.base/java.lang.Class.newInstance(Class.java:604)
    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:3302)
    at org.junit.runner.Description.formatDisplayName(Description.java:114)
    at org.junit.runner.Description.createTestDescription(Description.java:86)
    at org.junit.runners.BlockJUnit4ClassRunner.describeChild(BlockJUnit4ClassRunner.java:96)
    at org.junit.runners.BlockJUnit4ClassRunner.describeChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner.getDescription(ParentRunner.java:352)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:359)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
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:1109)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:183)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:780)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:701)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClass(BuiltinClassLoader.java:582)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:634)
    at java.base/java.lang.Class.forName(Class.java:505)
    at java.base/java.util.ServiceLoader.loadProvider(ServiceLoader.java:854)
    ... 40 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:1109)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:183)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:780)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassInModuleOrNull(BuiltinClassLoader.java:701)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClass(BuiltinClassLoader.java:582)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:634)
    at java.base/java.lang.Class.forName(Class.java:505)
    at java.base/java.util.ServiceLoader.loadProvider(ServiceLoader.java:854)
    ... 40 more

测试本身没有什么特别的,只是验证一些 POJO 类的

equals

public class GeoCoordinateTest {

    @Test
    public void test() {
        
        
        GeoCoordinate coord1 = new GeoCoordinate();
        coord1.setLatitude(5.0);
        coord1.setLongitude(10.0);

        GeoCoordinate coord2 = new GeoCoordinate();
        coord2.setLatitude(5.0);
        coord2.setLongitude(10.0);
        
        GeoCoordinate coord3 = new GeoCoordinate();
        coord3.setLatitude(5.1);
        coord3.setLongitude(10.0);
        
        
        assertEquals(coord1, coord2);
        assertNotEquals(coord1, coord3);
    }

}

它发生在 OpenJDK 14 下:

...>java -version
openjdk version "14.0.1" 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+7)
OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)

我很困惑。发生了什么事以及如何解决这个问题?

java maven maven-surefire-plugin
5个回答
4
投票

当我从 Java 8 升级到 Java 11 并使用 JetBrains 的 IDE Intellij IDEA 运行测试时,发生了这种情况。

我的情况是项目 SDK 与

'platform'
使用的不同。

就我而言,平台是 Gradle 的 JVM。如果有人遇到此问题,请知道您可以通过转至

Build Tool
>
Preferences
>
Build, Execution, Deployment
设置
Build Tools
来匹配项目 SDK。在这里,您可以选择
Gradle
或问题的
Maven
等。


1
投票

当我从 JDK11 升级到 JDF15 时,同样的情况也发生在我身上。 JDK14+出现此问题,JDK13则正常。


1
投票

我在一个包含 JDK 15、TestNG、mongo-java-driver、Selenium 和其他依赖项的自动化测试项目中遇到了这个问题。

由于 JDK 13 的 mongo 驱动程序中存在错误,我不得不升级到 JDK 15。此更新后,开始出现错误“无法加载 sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo”。

我用下面的 Maven 设置解决了这个问题。

<properties>
    <jacoco.version>0.8.6</jacoco.version>
</properties>

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <configuration>
            <systemPropertyVariables>
                <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile>
            </systemPropertyVariables>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${jacoco.version}</version>
        <executions>
            <execution>
                <id>default-prepare-agent</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <execution>
                <id>default-report</id>
                <phase>prepare-package</phase>
                <goals>
                    <goal>report</goal>
                </goals>
            </execution>
        </executions>

    </plugin>
</plugins>

0
投票

我在 Java 8、Eclipse 2021-03(重新安装)上遇到了完全相同的问题。 显然 Eclipse 附带了自己的 JRE,Gradle 将默认使用它。 要解决此问题,您需要转到 Preferences > Gradle 并手动 更改 Java Home 以匹配您的默认/系统/项目 Java Home


0
投票

java.util.ServiceConfigurationError:sun.util.locale.provider.LocaleDataMetaInfo:无法在 java.base/java.util.ServiceLoader.fail(ServiceLoader.java:582) 处加载 sun.util.resources.cldr.provider.CLDRLocaleDataMetaInfo

对我有用的解决方案: 我项目中的 build.gradle 的 java 版本为 11,在机器中为 17,所以我只是将 build.gradle 版本 11 更改为 17,这对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.