迁移到框架2.6会带来java.lang.ClassNotFoundException:jdk.internal.misc.Unsafe

时间:2017-08-30 11:03:58

标签: playframework playframework-2.6

尝试迁移到新的游戏版本2.6.3,但在应用程序启动时迁移后,我有如下例外:

[DEBUG] p.s.a.i.n.u.i.PlatformDependent0 - jdk.internal.misc.Unsafe.allocateUninitializedArray(int): unavailable
java.lang.ClassNotFoundException: jdk.internal.misc.Unsafe
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent0$6.run(PlatformDependent0.java:290)
        at java.security.AccessController.doPrivileged(Native Method)
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:283)
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent.getSystemClassLoader(PlatformDependent.java:637)
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent.isAndroid0(PlatformDependent.java:661)
        at play.shaded.ahc.io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.java:65

获得一些如何解决它的想法真的很棒。

3 个答案:

答案 0 :(得分:0)

迁移前您使用的是哪个版本的游戏。在我看来,Play WS迁移中的问题。

 at play.shaded.ahc.io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.java:283)
    at play.shaded.ahc.io.netty.util.internal.PlatformDependent.getSystemClassLoader(PlatformDependent.java:637)
    at play.shaded.ahc.io.netty.util.internal.PlatformDependent.isAndroid0(PlatformDependent.java:661)

这些是Play Standalone WS的例外。 (StandaloneAhcWSClient.class)

我不建议在Play项目中使用Play Standalone WS。此库(Play Standalone WS)在非播放项目中使用。

当然你可以忽略这个例外。

使用Play Standalone WS的示例

final String name = "wsclient";

ActorSystem system = ActorSystem.create(name);

system.registerOnTermination(() -> System.exit(0));

final ActorMaterializerSettings settings = ActorMaterializerSettings.create(system);

final ActorMaterializer materializer = ActorMaterializer.create(settings, system, name);

// Create the WS client from the application.conf file, the current classloader and materializer.

StandaloneAhcWSClient client = StandaloneAhcWSClient.create( AhcWSClientConfigFactory.forConfig(ConfigFactory.load(), system.getClass().getClassLoader()), materializer );

或创建

// Create the WS client from custom config StandaloneAhcWSClient client = StandaloneAhcWSClient.create( AhcWSClientConfigFactory.forClientConfig(WSClientConfig.apply( ... )), materializer );

在播放项目中使用包装器,其中包含DI

libraryDependencies += ws

这包括play-ahc-ws模块,该模块使用Play Dependency Injection绑定和组件,配置以及更好地集成它所需的任何其他内容来包装独立版本。

如果你想使用缓存支持,你需要添加ws,ehcache并启用和配置缓存:

libraryDependencies += ws

libraryDependencies += ehcache

答案 1 :(得分:0)

为什么要创建WS客户端的手动实例?你应该简单地@Inject WSClient,并使用它。

答案 2 :(得分:0)

根据链接:https://github.com/netty/netty/issues/6855,将netty版本升级到4.1.12.Final将解决此问题。升级到4.1.14.Final后,我也面临类似问题得到修复。