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.
- A primeira parte dos métodos java9-private pode ser definida na interface
- A segunda parte de java9-Java9 melhora a sintaxe try-with-resources
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/versions
diretó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.