Saltar al contenido

¿Por qué el tiempo de ejecución de Java 11 ignora mi jar que contiene clases sun.misc?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *