La tercera parte de la serie Java9: el mismo Jar admite varias versiones de JDK para ejecutar

En el próximo período de tiempo planeo escribir una serie de artículos sobre Java 9. Aunque Java 9 no es una versión básica de Java como Java 8 o Java 11, todavía hay muchas características a las que vale la pena prestar atención. Esperando su atención, escribiré una serie de artículos sobre Java 9, unos diez artículos.

El contenido de este artículo: En Java 9, se ha mejorado la compatibilidad con el formato de archivo de código de bytes de varias versiones de JAR. El mismo paquete Jar puede contener varias versiones de Java de archivos de clase. Con esta función, podemos actualizar la aplicación / biblioteca a una nueva versión de Java sin obligar a los usuarios a actualizar a la misma versión de Java.

1. Uso básico

Para liberar paquetes jar de códigos de bytes de múltiples versiones, se debe realizar la siguiente declaración en su MANIFEST.MF:

Multi-Release: true

El META-INF/versionsdirectorio de archivos del paquete jar puede contener varias versiones de archivos de clase. La estructura del directorio del resultado de la compilación es la siguiente:

jar root
  - A.class
  - B.class
  - META-INF
     - versions
        - 9
           - A.class

Suponga que el directorio raíz anterior es el archivo de código de bytes A.calss compilado con java 8 o versiones anteriores. META-INF/versions/9/Es el resultado compilado A.class del código java escrito en java 9.

  • Si el paquete jar se ejecuta en el entorno de ejecución de JDK 8, el archivo de clase en el directorio raíz se utilizará para la ejecución del programa.
  • Si el paquete jar se ejecuta en el entorno de ejecución de JDK 9, el META-INF/versions/9/siguiente archivo de clase se utilizará para la operación del programa.

Suponiendo que este proyecto actualizará JDK 10 en el futuro y decidirá usar algunas de las nuevas características de Java 10 en A.java, la sintaxis se puede actualizar por separado para A.class, y el resultado compilado a.class se colocará META-INF/versions/10/debajo

jar root
  - A.class
  - B.class
  - META-INF
     - versions
        - 9
           - A.class
        - 10
           - A.class

Ahora, el jar anterior contiene archivos de código de bytes que se pueden ejecutar en tres versiones de Java, y A.class es compatible con JDK 8, 9, 10.

Dos ejemplos reales

código java 8

El siguiente código de archivo de clase lo dejamos que se ejecute en el entorno de Java 8

package com.example;

public class IOUtil {
  public static String convertToString(InputStream inputStream) throws IOException {
      System.out.println("IOUtil 使用java 8 版本");
      Scanner scanner = new Scanner(inputStream, "UTF-8");
      String str = scanner.useDelimiter("\\A").next();
      scanner.close();
      return str;
  }
}

Agregue un archivo de entrada de la aplicación Main.java, llame al método IOUtil.convertToString para convertir InputStream en String.

package com.example;

public class Main {
  public static void main(String[] args) throws IOException {
          InputStream inputStream = new ByteArrayInputStream("测试字符串".getBytes());
          String result = IOUtil.convertToString(inputStream);
          System.out.println(result);
      }
}

Código Java 9

Después del lanzamiento de Java 9, decidimos reescribir el método IOUtil.convertToString usando la nueva sintaxis de Java 9.

package com.example;

public class IOUtil {
  public static String convertToString(InputStream inputStream) throws IOException {
      System.out.println("IOUtil 使用java 9 版本");
      try (inputStream) {  //Java9版本的增强try-with-resources
          String str = new String(inputStream.readAllBytes());
          return str;
      }
  }
}

Como se muestra en el código anterior, usamos las dos nuevas características del bloque try-with-resource de Java 9 con la referencia inputStream y el nuevo método InputStream.readAllBytes ().

Compilar

Compile el código IOUtil.java de Java8 y Java9 en archivos de código de bytes de clase en las versiones de JDK8 y JDK9 respectivamente, y guarde los archivos de clase de acuerdo con la siguiente estructura de directorios y escriba el paquete jar. (Primero escriba el paquete jar de acuerdo con la versión de java8, luego modifique el archivo MANIFEST.MF y agregue el archivo de clase de código de bytes de Java 9)

D:\multi-release-jar-example\my-lib-jar>tree /A /F
+---com
|   \---example
|           IOUtil.class
|           Main.class
|           
\---META-INF
    |   MANIFEST.MF
    |   
    \---versions
        \---9
            \---com
                \---example
                        IOUtil.class

Ejecutar clase principal

Ejecute este paquete jar en el entorno JDK 9

D:\multi-release-jar-example>java -cp my-lib.jar com.example.Main
IOUtil 使用java 9 版本
测试字符串

Ejecute este paquete jar en el entorno JDK 8

D:\multi-release-jar-example>C:\jdk1.8.0_151\bin\java -cp my-lib.jar com.example.Main
IOUtil 使用java 8 版本
测试字符串

Bienvenido a seguir mi blog, hay muchas colecciones boutique.

  • Este artículo se reproduce con una indicación de la fuente (se debe adjuntar la conexión y el texto no se puede reproducir únicamente): Blog de Letter Brother .

Si crees que es útil para ti, ¡dale me gusta y compártelo! ¡Tu apoyo es mi inagotable motivación creativa! . Además, el autor ha publicado el siguiente contenido de alta calidad recientemente y espero su atención.

Supongo que te gusta

Origin blog.csdn.net/hanxiaotongtong/article/details/109109168
Recomendado
Clasificación