Tenemos la mejor solución que hallamos en línea. Deseamos que te sirva de ayuda y si quieres comentarnos algo que nos pueda ayudar a mejorar hazlo con libertad.
Solución:
Esta respuesta está escrita usando
> java --version
openjdk 11.0.3 2019-04-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.3+7)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.3+7, mixed mode)
Primero, crea el proyecto que tendrá el anulado BASE64Encoder
. llamémoslo sun-misc-override
. Bajo srcmainjava
crear el sun.misc
paquete con BASE64Encoder
clase.
package sun.misc;
public class BASE64Encoder
public String encode(byte[] aBuffer)
return "Fake it until you make it!";
Si intentas compilarlo, obtendrás un sunmiscBASE64Encoder.java:1: error: package exists in another module: jdk.unsupported
error.
Eso nos da una pista de que necesitamos parchear el módulo. jdk.unsupported
. Esto se debe a que las clases del original sun.misc
el paquete se ha movido a la jdk.unsupported
cuando el sistema de módulos se implementó en Java 9 y luego se eliminó con el tiempo (ver JEP-260).
Con Maven puede configurar su complemento de compilación de esta manera:
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
11
--patch-module
jdk.unsupported=$project.basedir/src/main/java
Después com.example:sun-misc-override:1.0.0-SNAPSHOT
está construido, coloque el JAR resultante en su proyecto “principal”, como lo hizo, por ejemplo. en un lib
directorio. No he encontrado una manera de hacer que funcione con una dependencia regular de Maven.
Ahora, configure el complemento del compilador en su proyecto “principal”:
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
11
--patch-module=jdk.unsupported=$project.basedir/lib/sun-misc-override-1.0.0-SNAPSHOT.jar
(Probablemente debido a MCOMPILER-311 estaba recibiendo un NPE cuando traté de usar
--patch-module
jdk.unsupported=$project.basedir/lib/sun-misc-override-1.0.0-SNAPSHOT.jar
aunque se suponía que el error se solucionaría con maven-compiler-plugin 3.8.0 y funcionó bien en el POM de sun-misc-override
.)
Ahora mi proyecto “principal” se llama j11
y tiene una clase:
package com.example;
import sun.misc.BASE64Encoder;
public class BASE64EncoderTest
public static void main(String[] args)
System.out.println("Testing - " + new BASE64Encoder().encode(new byte[0]));
Para ejecutarlo, debe especificar --patch-module
de nuevo:
> java --patch-module=jdk.unsupported=libsun-misc-override-1.0.0-SNAPSHOT.jar -cp targetj11-1.0.0-SNAPSHOT.jar com.example.BASE64EncoderTest
Testing - Fake it until you make it!
En versiones anteriores, Sun hizo todo lo posible para asegurarse de que no hubiera forma de alterar el tiempo de ejecución de la forma en que lo está intentando ahora (si hubiera sido tan fácil como esto, todos podrían haber creado su propia variante privada del tiempo de ejecución, y seguramente comprenderás que eso no hubiera sido bueno). No conozco los detalles, pero probablemente se redujeron a “si el nombre del paquete es esto o aquello, entonces la carga solo se realizará desde rt.jar”, codificado en las cosas de los cargadores de clases. Parece muy probable que esas medidas de aplicación (o similares) sigan vigentes.
Descarté el resto de mi respuesta porque creo que entiendes muy bien cuáles son tus opciones y esa no era la pregunta.
Eres capaz de avalar nuestra función fijando un comentario y puntuándolo te damos las gracias.