A terceira parte da série Java9 - o mesmo Jar oferece suporte a várias versões de JDK para executar

Planejo escrever uma série de artigos sobre o Java 9. Embora o Java 9 não seja uma versão básica do Java como o Java 8 ou o Java 11, ainda existem muitos recursos aos quais vale a pena prestar atenção. Aguardando sua atenção, escreverei uma série de artigos sobre Java 9, cerca de dez artigos.

O conteúdo deste artigo: Em Java 9, o suporte para o formato de arquivo bytecode multi-versão JAR é aprimorado.O mesmo pacote Jar pode conter várias versões Java de arquivos de classe. Usando este recurso, podemos atualizar o aplicativo / biblioteca para uma nova versão do Java sem forçar os usuários a atualizar para a mesma versão do Java.

1. Uso básico

Para liberar pacotes jar de bytecodes de várias versões, a seguinte declaração deve ser feita em seu MANIFEST.MF:

Multi-Release: true

O META-INF/versionsdiretório de arquivo do pacote jar pode conter várias versões de arquivos de classe. A estrutura de diretório do resultado da compilação é a seguinte:

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

Suponha que o diretório raiz acima seja o arquivo bytecode A.calss compilado com java 8 ou versões anteriores. META-INF/versions/9/É o resultado compilado A.class do código java escrito em java 9.

  • Se o pacote jar for executado no ambiente de tempo de execução do JDK 8, o arquivo de classe no diretório raiz será usado para a execução do programa.
  • Se o pacote jar estiver sendo executado no ambiente de tempo de execução do JDK 9, o META-INF/versions/9/seguinte arquivo de classe será usado para a operação do programa.

Supondo que este projeto atualizará o JDK 10 no futuro e decidirá usar alguns dos novos recursos do Java 10 em A.java, a sintaxe pode ser atualizada separadamente para A.class, e o resultado compilado a.class será colocado META-INF/versions/10/abaixo

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

Agora, o jar acima contém arquivos de bytecode que podem ser executados em três versões Java, e A.class é compatível com JDK 8, 9, 10.

Dois, exemplos reais

código java 8

O código do arquivo de classe a seguir, permitimos que ele seja executado no ambiente 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;
  }
}

Adicione um arquivo de entrada do aplicativo Main.java, chame o método IOUtil.convertToString para converter InputStream em 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

Após o lançamento do Java 9, decidimos reescrever o método IOUtil.convertToString usando a nova sintaxe do 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;
      }
  }
}

Conforme mostrado no código acima, usamos os dois novos recursos do bloco try-with-resource do Java 9 com referência inputStream e o novo método InputStream.readAllBytes ().

Compilar

Compile o código IOUtil.java de Java8 e Java9 em arquivos bytecode de classe nas versões de JDK8 e JDK9 respectivamente e salve os arquivos de classe de acordo com a seguinte estrutura de diretório e digite o pacote jar. (Primeiro digite o pacote jar de acordo com a versão java8, então modifique o arquivo MANIFEST.MF e adicione o arquivo de classe de bytecode 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

Executar classe principal

Execute este pacote jar no ambiente JDK 9

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

Execute este pacote jar no ambiente JDK 8

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

Bem-vindo a seguir meu blog, existem muitas coleções boutique

  • Este artigo é reproduzido com a indicação da fonte (a conexão deve ser anexada, e o texto não pode ser reproduzido somente): Carta Blog da Brother .

Se você acha que é útil para você, por favor, curta e compartilhe para mim! Seu apoio é minha motivação criativa inesgotável! . Além disso, o autor produziu o seguinte conteúdo de alta qualidade recentemente e espero sua atenção.

Acho que você gosta

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