web-dev-qa-db-fra.com

Netty - ne peut pas accéder à la classe jdk.internal.misc.Unsafe

Lorsque j'ai mis à niveau le Java de 8 à 11, j'ai reçu une erreur de Netty à propos du "jdk.internal.misc.Unsafe", les détails sont ci-dessous:

Je savais que c'était un message de niveau de débogage et je pouvais changer le niveau du journal pour l'ignorer. Mais je ne sais pas s'il y aurait d'autres problèmes - tels que les performances - quand je l'ignorerais. Quelqu'un connaît-il la meilleure solution à cela?

Java.lang.IllegalAccessException: class io.netty.util.internal.PlatformDependent0$6 cannot access class jdk.internal.misc.Unsafe (in module Java.base) because module Java.base does not export jdk.internal.misc to unnamed module @84b8f0f
    at jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.Java:361) ~[?:?]
    at Java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.Java:591) ~[?:?]
    at Java.lang.reflect.Method.invoke(Method.Java:558) ~[?:?]
    at io.netty.util.internal.PlatformDependent0$6.run(PlatformDependent0.Java:334) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
    at Java.security.AccessController.doPrivileged(Native Method) ~[?:?]
    at io.netty.util.internal.PlatformDependent0.<clinit>(PlatformDependent0.Java:325) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.util.internal.PlatformDependent.isAndroid(PlatformDependent.Java:214) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.util.internal.PlatformDependent.<clinit>(PlatformDependent.Java:82) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.buffer.UnpooledByteBufAllocator.<clinit>(UnpooledByteBufAllocator.Java:37) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
    at io.netty.buffer.Unpooled.<clinit>(Unpooled.Java:73) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
    at wedo.stream3.framework.base.connector.supplier.DelimiterDecoderSupplier.getDelimiter(DelimiterDecoderSupplier.Java:41) ~[classes/:?]
    at wedo.stream3.framework.base.connector.supplier.DelimiterDecoderSupplier.<init>(DelimiterDecoderSupplier.Java:26) ~[classes/:?]
    at wedo.stream3.framework.base.connector.supplier.DelimiterDecoderSupplier.<init>(DelimiterDecoderSupplier.Java:20) ~[classes/:?]
    at wedo.stream3.framework.base.connector.supplier.CommonChannelHandlerSupplier.<init>(CommonChannelHandlerSupplier.Java:37) ~[classes/:?]
    at wedo.stream3.framework.base.connector.supplier.CommonChannelHandlerSupplier.<init>(CommonChannelHandlerSupplier.Java:25) ~[classes/:?]
    at wedo.stream3.framework.base.connector.TcpClientConnector.start(TcpClientConnector.Java:39) ~[classes/:?]
    at wedo.stream3.framework.bootstrap.FrameworkLauncher.lambda$start$0(FrameworkLauncher.Java:61) ~[classes/:?]
    at Java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.Java:183) [?:?]
    at Java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.Java:177) [?:?]
    at Java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.Java:1654) [?:?]
    at Java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.Java:484) [?:?]
    at Java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.Java:474) [?:?]
    at Java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.Java:150) [?:?]
    at Java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.Java:173) [?:?]
    at Java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.Java:234) [?:?]
    at Java.util.stream.ReferencePipeline.forEach(ReferencePipeline.Java:497) [?:?]
    at wedo.stream3.framework.bootstrap.FrameworkLauncher.start(FrameworkLauncher.Java:58) [classes/:?]
    at org.stream3.prototype.mfc.App.launchFramework(App.Java:58) [classes/:?]
    at org.stream3.prototype.mfc.App.main(App.Java:41) [classes/:?]
14
oarsmanli

Pour permettre à netty d'accéder à la classe, démarrez Java avec l'option suivante:

--add-opens Java.base/jdk.internal.misc=ALL-UNNAMED

Cela ouvre le package jdk.internal.misc dans le module Java.base au module non nommé.

Voir aussi la documentation pour commande Java , et ceci introduction au Java en général.

EDIT: pour que Netty utilise ses optimisations directes de tampon, vous devez également définir

-Dio.netty.tryReflectionSetAccessible=true

Il existe un certain nombre de problèmes Netty à ce sujet, voir par ex. netty/issues/7769

9
gjoranv

Lorsque vous exécutez Netty sur Java 11, ajoutez ces options VM pour activer les optimisations de performances:

--add-opens Java.base/jdk.internal.misc=ALL-UNNAMED
-Dio.netty.tryReflectionSetAccessible=true

Ensuite, pour savoir quand une réflexion profonde est utilisée, vous pouvez ajouter:

--illegal-access=warn
7

Comme vous l'avez dit, ce n'est qu'un message de débogage et peut être ignoré. Il vous indique essentiellement que Netty ne peut pas utiliser "toutes les optimisations" car il ne peut pas accéder à une classe. Si vous le souhaitez, vous pouvez ouvrir le niveau d'accès via des drapeaux de ligne de commande lors du démarrage de votre application.

1
Norman Maurer