0

Netty - Невозможно получить доступ к классу jdk.internal.misc.Unsafe

10

Проблема после обновления Java с версии 8 до 11: ошибка, связанная с jdk.internal.misc.Unsafe.

Я получил сообщение об ошибке от Netty, которое выглядит следующим образом:

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) ~[?:?]
    ... (остальные строки стека)

Я осознаю, что это сообщение уровня отладки и могу изменить уровень логирования, чтобы игнорировать его. Однако я не уверен, повлияет ли это на другие аспекты, такие как производительность или стабильность приложения.

Кто-нибудь сталкивался с подобной проблемой и знает наилучшее решение для данной ситуации? Буду благодарен за советы!

3 ответ(ов)

0

При запуске Netty на Java 11 добавьте следующие параметры VM для включения оптимизаций производительности:

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

Кроме того, если вы хотите отслеживать, когда используется глубокое отражение, вы можете добавить:

--illegal-access=warn

Эти настройки помогут улучшить производительность вашей приложения, а также уведомить вас о случае несанкционированного доступа к внутренним API.

0

Как вы уже упомянули, это всего лишь отладочное сообщение, и его можно игнорировать. Оно говорит о том, что Netty не может использовать «все оптимизации», поскольку не может получить доступ к определенному классу. Если вы хотите, вы можете изменить уровень доступа через флаги командной строки при запуске вашего приложения.

0

Чтобы запустить приложение, использующее Netty, требуется доступ к модулю JDK. Для этого нужно добавить аргумент JVM при запуске приложения:

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

Дополнительно, если вы хотите отключить предупреждение "java.lang.UnsupportedOperationException: Reflective setAccessible(true) disabled.....", вы можете также включить следующее:

-Dio.netty.tryReflectionSetAccessible=true

Если вы используете Gradle, то эти параметры можно добавить в файл build.gradle следующим образом:

distributions {
    applicationDefaultJvmArgs = ["--add-opens",
                                 "java.base/jdk.internal.misc=ALL-UNNAMED", "-Dio.netty.tryReflectionSetAccessible=true"]
    mainClassName = 'cl.domain.ServerLauncher'
    archivesBaseName = 'your-service'
    version = 'latest'
    main {
        baseName = 'your-service'
    }
}

Таким образом, указанные команды обеспечат корректную работу вашего приложения с Netty, устраняя возникшие проблемы с доступом к внутренним модулям.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь