Netty - Невозможно получить доступ к классу jdk.internal.misc.Unsafe
Проблема после обновления 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 ответ(ов)
При запуске Netty на Java 11 добавьте следующие параметры VM для включения оптимизаций производительности:
--add-opens java.base/jdk.internal.misc=ALL-UNNAMED
-Dio.netty.tryReflectionSetAccessible=true
Кроме того, если вы хотите отслеживать, когда используется глубокое отражение, вы можете добавить:
--illegal-access=warn
Эти настройки помогут улучшить производительность вашей приложения, а также уведомить вас о случае несанкционированного доступа к внутренним API.
Как вы уже упомянули, это всего лишь отладочное сообщение, и его можно игнорировать. Оно говорит о том, что Netty не может использовать «все оптимизации», поскольку не может получить доступ к определенному классу. Если вы хотите, вы можете изменить уровень доступа через флаги командной строки при запуске вашего приложения.
Чтобы запустить приложение, использующее 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, устраняя возникшие проблемы с доступом к внутренним модулям.
Как устранить java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
Проверьте, что строка не равна null и не пуста
Почему компилятор Java 11 использует invokevirtual для вызова приватных методов?
Почему Java 14 не является LTS?
Инициализация ArrayList в одну строчку