JDK9: Произошла недопустимая операция доступа с отражением. org.python.core.PySystemState
Я пытаюсь запустить программу DMelt Programs ( http://jwork.org/dmelt/), используя Java9 (JDK9), и она выдает мне такие ошибки, как:
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.python.core.PySystemState (file:/dmelt/jehep/lib/jython/jython.jar) to method java.io.Console.encoding()
WARNING: Please consider reporting this to the maintainers of org.python.core.PySystemState
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Как я могу это исправить? Я пытался добавить –illegal-access= allow в последнюю строку скрипта "dmelt.sh" (я использую bash в Linux), но это не решило эту проблему. Я очень расстраиваюсь с этим. Я использовал эту программу очень часто, в течение очень долгого времени. Может быть, я никогда не должен переходить на JDK9
9 ответов
Идеальным способом решения этой проблемы было бы
сообщить об этом сопровождающим org.python.core.PySystemState
и просить их исправить такой рефлексивный доступ в будущем.
Однако, если режим по умолчанию разрешает нелегальный рефлексивный доступ, важно сообщить об этом, чтобы люди не удивлялись, когда в будущем выпуске этот режим больше не будет режимом по умолчанию.
Из одной из тем в списке рассылки:
--illegal-access=permit
Это будет режим по умолчанию для JDK 9. Он открывает каждый пакет в каждом явном модуле для кодирования во всех безымянных модулях, т. Е. Кода на пути к классам, так же, как
--permit-illegal-access
делает сегодня.Первая недопустимая операция отраженного доступа вызывает предупреждение, как
--permit-illegal-access
, но после этого момента предупреждения не выдаются. Это единственное предупреждение описывает, как включить дополнительные предупреждения.
--illegal-access=deny
Это отключает все недопустимые операции отражающего доступа, за исключением тех, которые включены другими параметрами командной строки, такими как
--add-opens
, Это станет режимом по умолчанию в будущем выпуске.
Предупреждающих сообщений в любом режиме можно избежать, как и раньше, путем разумного использования --add-exports
а также --add-opens
опции.
Следовательно, текущее временное решение доступно для использования --add-exports
как аргументы VM, как упомянуто в документах:
--add-exports module/package=target-module(,target-module)*
Модуль обновлений для
export
пакет дляtarget-module
независимо от объявления модуля.target-module
все безымянные можно экспортировать во все безымянные модули.
Это позволило бы target-module
чтобы получить доступ ко всем публичным типам в package
, В случае, если вы хотите получить доступ к внутренним классам jdk, которые по-прежнему будут инкапсулированы, вы должны позволить глубокое отражение, используя --add-opens
аргумент как:
--add-opens module/package=target-module(,target-module)*
Модуль обновлений для
open
пакет дляtarget-module
независимо от объявления модуля.
В вашем случае в настоящее время доступ к java.io.Console
, вы можете просто добавить это как параметр VM -
--add-opens java.base/java.io=ALL-UNNAMED
Кроме того, заметка из той же темы, что и ссылка выше
когда deny
становится режимом по умолчанию, тогда я ожидаю permit
поддерживать как минимум одну версию, чтобы разработчики могли продолжить миграцию своего кода. permit
, warn
, а также debug
режимы со временем будут удалены, как и --illegal-access
Сам вариант.
Так что лучше изменить реализацию и следовать идеальному решению.
Похоже, что DMelt использует Jython, и это предупреждение необходимо учитывать сопровождающим Jython. Здесь есть проблема отслеживания: http://bugs.jython.org/issue2582
Реальная проблема - проблема в JDK. На самом деле незаконного доступа нет, но JDK-метод trySetAccessible работает неправильно. Надеемся, что это будет исправлено в следующей версии JDK.
попробуйте решить ниже ответ ссылку
Чтобы избежать этой ошибки, необходимо переопределить maven-war-plugin
к новому. Например:
<plugins>
. . .
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
PS работает для jdk-12
Разработчики Jython не имеют никакого практического решения для jdk9, согласно этому посту http://bugs.jython.org/issue2582. Предыдущее объяснение кажется очень длинным, чтобы понять, что должно быть сделано. Я просто хочу, чтобы jdk9 вел себя точно так же, как jdk1.4 - 1.8, т.е. Сила JVM в обратной сопоставимости. Я полностью в порядке, чтобы иметь дополнительные опции в JDK9, но новые функции не могут сломать приложения
После обновления Java 9 появляется предупреждение "Произошла недопустимая операция отражающего доступа".
я добавил --illegal-access=permit
в моем eclipse.ini
но это не устраняет предупреждение при создании сборки в eclipse из Maven.
Попробуйте заменить плагин компиляции maven. Я решил это из Maven Build и Maven Install, изменив моиpom.xml
файл в нескольких проектах, когда я обновился до с jdk1.8
к jdk1.12
в соответствии со следующими примерами:
Сменить версию с:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.4</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<webXml>WebContent\WEB-INF\web.xml</webXml>
</configuration>
</plugin>
Кому:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<warSourceDirectory>WebContent</warSourceDirectory>
<webXml>WebContent\WEB-INF\web.xml</webXml>
</configuration>
</plugin>
А также изменил artifactId и версию From:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
Кому:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
Когда я повторно запускаю Maven Build или Maven Install, "произошла незаконная операция отражающего доступа" больше нет.
Пришел сюда, когда работал над проектом Kotlin Spring. Решили проблему:
cd /project/root/
touch .mvn/jvm.config
echo "--illegal-access=permit" >> .mvn/jvm.config
Некоторые недавние отзывы.
как указано в коде ошибки Java
WARNING: All illegal access operations will be denied in a future release
Этот будущий выпуск - JDK 17, в котором параметр запуска перестанет работать.
Дополнительную информацию непосредственно из Oracle можно найти здесь: JEP 403 ссылка 1 и JEP 403 ссылка 2
После этого изменения конечные пользователи больше не смогут использовать параметр --illegal-access, чтобы разрешить доступ к внутренним элементам JDK. (Список затронутых пакетов доступен здесь.) Пакеты sun.misc и sun.reflect по-прежнему будут экспортироваться модулем jdk.unsupported и будут по-прежнему открыты, так что код может получить доступ к своим закрытым элементам через отражение. Никакие другие пакеты JDK не будут открываться таким образом.
По-прежнему можно будет использовать параметр командной строки --add-opens или атрибут манифеста файла JAR Add-Opens для открытия определенных пакетов.
Итак, решение
Возможно, исправление ниже работает и для java 9:
В моем случае версия java open jdk была 10.0.2 и получила ту же ошибку (произошла недопустимая операция доступа с отражением). Я обновил maven до версии 3.6.0 в Linux, и проблема исчезла.