Playframework 迁移到play framework 2.6会带来java.lang.ClassNotFoundException:jdk.internal.misc.Unsafe

Playframework 迁移到play framework 2.6会带来java.lang.ClassNotFoundException:jdk.internal.misc.Unsafe,playframework,playframework-2.6,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.findC

尝试迁移到新的播放版本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
[DEBUG]p.s.a.i.n.u.i.PlatformDependent0-jdk.internal.misc.Unsafe.allocateUninitializedArray(int):不可用
java.lang.ClassNotFoundException:jdk.internal.misc.Unsafe
位于java.net.URLClassLoader.findClass(URLClassLoader.java:381)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:424)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:357)
播放时.shade.ahc.io.netty.util.internal.PlatformDependent0$6.run(PlatformDependent0.java:290)
位于java.security.AccessController.doPrivileged(本机方法)
play.shade.ahc.io.netty.util.internal.PlatformDependent0.(PlatformDependent0.java:283)
play.shade.ahc.io.netty.util.internal.PlatformDependent.getSystemClassLoader(PlatformDependent.java:637)
play.shade.ahc.io.netty.util.internal.PlatformDependent.isAndroid0(PlatformDependent.java:661)
play.shade.ahc.io.netty.util.internal.PlatformDependent.(PlatformDependent.java:65)

如果能找到一些解决方法,那将非常好。

在迁移之前,您使用了哪个版本的play。在我看来,play WS-migration中存在这个问题

 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.shade.ahc.io.netty.util.internal.PlatformDependent0.(PlatformDependent0.java:283)
play.shade.ahc.io.netty.util.internal.PlatformDependent.getSystemClassLoader(PlatformDependent.java:637)
play.shade.ahc.io.netty.util.internal.PlatformDependent.isAndroid0(PlatformDependent.java:661)
这些是Play Standalone WS的例外。(StandaloneAhcWSClient.class)

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

当然,您可以忽略此异常


使用Play Standalone WS的示例
final String name=“wsclient”

ActorSystem系统=ActorSystem.create(名称);

system.registerontemination(()->system.exit(0));

final-ActorMaterializerSettings设置=ActorMaterializerSettings.create(系统);

final-ActorMaterializer-materializer=ActorMaterializer.create(设置、系统、名称);

//从application.conf文件、当前类加载器和物化器创建WS-client。

StandaloneAhcWSClient=StandaloneAhcWSClient.create(
AhcWSClientConfigFactory.forConfig(ConfigFactory.load(),system.getClass().getClassLoader()),
物化器
);

或创造

//从自定义配置创建WS-client
StandaloneAhcWSClient=StandaloneAhcWSClient.create(
AhcWSClientConfigFactory.forClientConfig(WSClientConfig.apply(
...
)),
物化器
);


正在运行的项目使用包装器,它具有DI
libraryDependencies+=ws

这包括play ahc ws模块,该模块使用play依赖项注入绑定和组件、配置以及更好地集成它所需的任何其他内容来包装独立版本

如果要使用缓存支持,则需要添加ws、ehcache以及启用和配置缓存:

libraryDependencies+=ws


libraryDependencies+=ehcache

为什么要创建WS-client的手动实例?您应该简单地@Inject WSClient,然后使用它。

根据链接:,将netty版本升级到4.1.12.Final将解决此问题。我还面临着升级到4.1.14.Final后修复的类似问题。

如果我理解您的建议请正确评论,我有几点意见:我没有在Play project中使用Play Standalone WS。更准确地说,我有一个Play project,并像往常一样在set build configuration中的库中包含WS。我使用的WS客户端创建如下:
AhcWSClient(AhcWSClientConfig(keepAlive=configForKeepAlive,maxConnectionsPerHost=configForConnectionsPerHost))
因为我需要使用一些参数对其进行配置,建议不要使用ws,而是实现您自己的WSClient提供程序。这样,您可以提供您自己的配置,如果需要,还可以使配置依赖于@Named注释。如果这不是一个选项,请查看该选项,它描述了手动创建WSClient的正确方法。可以吗发布项目的dependencyGraph?该错误基本上是一个Netty错误,但似乎出现在4.1中。由于阴影版本使用4.0,我很惊讶您会发现这一点。我们遇到了相同的问题,并且在迁移后它肯定与我们的WSClient有关。我只是想知道为什么我们会得到Netty的豁免,因为play 2.6应该使用akka ht而是tp?因为WSClient仍然使用Netty,同样在2.6中。