Это случилось?Есть ли параметр –illegal-access?
Да, похоже, что это произошло - по крайней мере, для OpenJDK / OracleJDK.Опция указана в документации для java
«инструмента».
Она также указана при выполнении java --help-extra
.
Примечание: JDK-В документации упоминается, что эта опция будет удалена в следующем выпуске.
Как они установлены?Аргументы в пользу запуска JVM?
Да, это опция командной строки.Пример:
java --illegal-access=deny --module-path <path> --module <module>/<main-class> [args...]
Как получить текущее значение во время выполнения?
К сожалению, я не знаю ни одного способа запроса значения во время выполнения.Кажется, он не является частью свойств системы или среды.Я попытался найти, где значение использовалось внутренне, но не смог (но, честно говоря, я не тратил слишком много времени на поиск).
Для удобства вот документация --illegal-access
для JDK-11:
- недопустимый доступ = параметр
При наличии во время выполнения, --illegal-access=
принимает ключевое слово parameter
, чтобы указать режимоперации:
Примечание:
Эта опция будет удалена в следующем выпуске.
permit
: Эторежим открывает каждый пакет в каждом модуле в образе времени выполнения для кодирования во всех безымянных модулях (например, код в пути к классам), если этот пакет существовал в JDK 8. Это обеспечивает как статический доступ (например, с помощью скомпилированного байт-кода)и глубокий рефлексивный доступ) через различные API рефлексии платформы.Первая операция отражающего доступа к любому такому пакету вызывает предупреждение.Тем не менее, после первого появления предупреждения не выдаются.Это единственное предупреждение описывает, как включить дальнейшие предупреждения.Этот режим используется по умолчанию для текущего JDK, но изменится в следующем выпуске.
warn
: этот режим идентичен permit
за исключением того, что для каждого сообщения выдается предупреждениенедопустимая операция отражающего доступа.
debug
: этот режим идентичен warn
за исключением того, что для каждой недопустимой операции отраженного доступа выдается как предупреждающее сообщение, так и трассировка стека.
deny
: этот режим отключает все операции с несанкционированным доступом, кроме тех, которые включены другими параметрами командной строки, такими как --add-opens
.Этот режим станет режимом по умолчанию в будущем выпуске.
Режим по умолчанию, --illegal-access=permit
, предназначен для того, чтобы вы знали о коде на пути к классам, который рефлексивно обращается к любому внутреннему JDKAPI хотя бы один раз.Чтобы узнать обо всех таких доступах, вы можете использовать режимы warn
или debug
.Для каждой библиотеки или инфраструктуры на пути к классам, для которых требуется недопустимый доступ, у вас есть два варианта:
Если сопровождающие компонента уже выпустили фиксированную версию, которая больше не использует внутренние API JDK, тогдаВы можете рассмотреть возможность обновления до этой версии.
Если компонент все еще нуждается в исправлении, то вы можете связаться с его сопровождающими и попросить их заменить использование им внутренних API-интерфейсов JDK на соответствующиеэкспортированные API.
Если вам необходимо продолжать использовать компонент, требующий несанкционированного доступа, вы можете исключить предупреждающие сообщения, используя одну или несколько опций --add-opens
, чтобы открывать только эти внутренние пакеты.к которому требуется доступ.
Чтобы убедиться, что ваше приложение готово к будущей версии JDK, запустите его с --illegal-access=deny
вместе со всеми необходимыми опциями --add-opens
.Любые оставшиеся ошибки недопустимого доступа, скорее всего, будут связаны со статическими ссылками из скомпилированного кода на внутренние API JDK.Вы можете определить их, запустив инструмент jdeps с опцией --jdk-internals
.Из соображений производительности текущий JDK не выдает предупреждений о недопустимых операциях статического доступа.