java - modules - JDK9: se ha producido una operación ilegal de acceso reflectante. org.python.core.PySystemState
java modular (6)
El problema real es un problema en el JDK. En realidad no hay acceso ilegal, pero el método JDK trySetAccessible se está portando mal. Con suerte, esto se solucionará en una futura versión de JDK.
intenta resolver el siguiente link respuesta
Estoy tratando de ejecutar programas DMelt ( http://jwork.org/dmelt/ ) utilizando Java9 (JDK9), y me da errores como:
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
¿Cómo puedo arreglarlo? Intenté agregar –illegal-access = permit a la última línea del script "dmelt.sh" (estoy usando bash en Linux), pero esto no resolvió este problema. Estoy muy frustrante con esto. Estaba usando este programa muy a menudo, durante mucho tiempo. Tal vez nunca debería mudarme a JDK9
La forma ideal de resolver esto sería
informar esto a los mantenedores de org.python.core.PySystemState
y pidiéndoles que arreglen ese acceso reflexivo en el futuro.
Sin embargo, si el modo predeterminado permite el acceso reflectante ilegal, entonces es esencial darlo a conocer para que las personas no se sorprendan cuando este ya no sea el modo predeterminado en una versión futura.
De uno de los hilos en la lista de correo :
--illegal-access=permit
Este será el modo predeterminado para JDK 9. Abre todos los paquetes en cada módulo explícito para codificar en todos los módulos sin nombre, es decir, el código en la ruta de clase, tal como lo hace hoy
--permit-illegal-access
.La primera operación ilegal de acceso reflexivo hace que se emita una advertencia, como con
--permit-illegal-access
, pero no se emiten advertencias después de ese punto. Esta advertencia única describirá cómo habilitar advertencias adicionales.
--illegal-access=deny
Esto deshabilita todas las operaciones ilegales de acceso reflexivo, excepto las habilitadas por otras opciones de línea de comandos, como
--add-opens
. Este se convertirá en el modo predeterminado en una versión futura.
Los mensajes de advertencia en cualquier modo se pueden evitar, como antes, mediante el uso juicioso de las
--add-exports
y
--add-opens
.
Por lo tanto, una solución temporal actual disponible es usar
--add-exports
como los argumentos de VM como se menciona en los
docs
:
--add-exports module/package=target-module(,target-module)*
Actualiza el módulo para
export
paquete altarget-module
, independientemente de la declaración del módulo. Eltarget-module
puede estar sin nombre para exportar a todos los módulos sin nombre.
Esto permitiría que el
target-module
acceda a todos los tipos públicos en el
package
.
En caso de que desee acceder a las clases internas de jdk que aún estarían encapsuladas, tendría que permitir una
reflexión profunda
utilizando el argumento
--add-opens
como:
--add-opens module/package=target-module(,target-module)*
Actualiza el módulo para
open
paquete altarget-module
, independientemente de la declaración del módulo.
En su caso para acceder actualmente a
java.io.Console
, simplemente puede agregar esto como una opción de VM:
--add-opens java.base/java.io=ALL-UNNAMED
Además, tenga en cuenta el mismo hilo que el enlace anterior
Cuando
deny
convierte en el modo predeterminado, espero que el
permit
siga siendo compatible durante al menos una versión, para que los desarrolladores puedan continuar migrando su código.
Los modos de
permit
,
warn
y
debug
se eliminarán, con el tiempo, al igual que la
--illegal-access
.
Por lo tanto, es mejor cambiar la implementación y seguir la solución ideal.
Los desarrolladores de Jython no tienen ninguna solución práctica para jdk9, según esta publicación http://bugs.jython.org/issue2582 . La explicación anterior parece muy larga para descubrir qué debería hacerse. Solo quiero que jdk9 se comporte exactamente como jdk1.4 - 1.8, es decir, sea totalmente silencioso. La fuerza de JVM en la comparabilidad hacia atrás. Estoy totalmente de acuerdo con tener opciones adicionales en JDK9, pero las nuevas características no pueden romper las aplicaciones
Para evitar este error, debe redefinir el
maven-war-plugin
a uno más nuevo.
Por ejemplo:
<plugins>
. . .
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
</plugins>
PS
funciona para
jdk-12
Parece que DMelt usa Jython y esta advertencia es algo que los encargados del mantenimiento de Jython deberán abordar. Hay un problema para rastrearlo aquí: http://bugs.jython.org/issue2582
Quizás la solución a continuación funcione también para Java 9:
En mi caso, la versión java open jdk era 10.0.2 y obtuvo el mismo error (se ha producido una operación de acceso reflectante ilegal). Actualicé Maven a la versión 3.6.0 en Linux, y el problema desapareció.