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 для открытия определенных пакетов.

Итак, решение и пример будет продолжать работать с JDK 17 и будущими выпусками, но не буду.

Возможно, исправление ниже работает и для java 9:

В моем случае версия java open jdk была 10.0.2 и получила ту же ошибку (произошла недопустимая операция доступа с отражением). Я обновил maven до версии 3.6.0 в Linux, и проблема исчезла.

Другие вопросы по тегам