Guia do jlink
1. Visão geral
jlink é uma ferramenta que gera uma imagem de tempo de execução Java personalizada que contém apenas os módulos da plataforma necessários para um determinado aplicativo.
Essa imagem de tempo de execução age exatamente como o JRE, mas contém apenas os módulos que escolhemos e as dependências que eles precisam para funcionar. O conceito de imagens de tempo de execução modulares foi introduzido emJEP 220.
Neste tutorial, aprenderemos como criar um JRE personalizado usandojlink, e também executaremos e testaremos se nosso módulo funciona corretamente dentro de nosso JRE.
2. Necessidade de criar um JRE customizado
Vamos entender a motivação por trás das imagens de tempo de execução personalizadas com um exemplo.
Vamos criar um aplicativo modular simples. Para saber mais sobre a criação de aplicativos modulares, consulteour article on modularity.
Primeiro, vamos criar uma classeHelloWorld e um módulo correspondente:
public class HelloWorld {
private static final Logger LOG = Logger.getLogger(HelloWorld.class.getName());
public static void main(String[] args) {
LOG.info("Hello World!");
}
}
module jlinkModule {
requires java.logging;
}
Para executar este programa, precisamos apenas deHelloWorld,String,Logger eObject classes.
Mesmo que este programa precise de apenas quatro classes para ser executado, todas as classes predefinidas no JRE também são executadas, mesmo se nosso programa não as exigir.
Portanto, para executar um pequeno programa, precisamos manter um JRE completo, que é simplesmente um desperdício de memória.
Portanto, um JRE customizado é a melhor opção para executar nosso exemplo.
Comjlink, podemos criar nosso próprio JRE pequeno que contém apenas as classes relevantes que queremos usar, sem desperdiçar memória e, como resultado, veremos um melhor desempenho.
3. Criação de imagens Java Runtime personalizadas
Vamos realizar uma série de etapas simples para criar imagens JRE personalizadas.
3.1. Compilando um módulo
Primeiro, vamos compilar o programa mencionado acima a partir da linha de comando:
javac -d out module-info.java
javac -d out --module-path out com\example\jlink\HelloWorld.java
Agora, vamos executar o programa:
java --module-path out --module jlinkModule/com.example.jlink.HelloWorld
A saída será:
Mar 13, 2019 10:15:40 AM com.example.jlink.HelloWorld main
INFO: Hello World!
3.2. Usandojdeps para listar os módulos dependentes
Para usarjlink, precisamos saber a lista dos módulos JDK que o aplicativo usa e que devemos incluir em nosso JRE personalizado.
Vamos usar ojdeps command para obter os módulos dependentes usados no aplicativo:
jdeps --module-path out -s --module jlinkModule
A saída será:
jlinkModule -> java.base
jlinkModule -> java.logging
Isso faz sentido, poisjava.base é o módulo mínimo necessário para bibliotecas de código Java ejava.logging é usado por um criador de logs em nosso programa.
3.3. Criação de um JRE personalizado comjlink
Para criar um JRE personalizado para um aplicativo baseado em módulo, podemos usar o comandojlink. Esta é sua sintaxe básica:
jlink [options] –module-path modulepath
–add-modules module [, module…]
--output
Agora, vamoscreate a custom JRE for our program usando Java 11:
jlink --module-path "%JAVA_HOME%\jmods";out
--add-modules jlinkModule
--output customjre
Aqui, o valor após o parâmetro–add-modules informa ajlink qual módulo incluir no JRE.
Finalmente, ocustomjre next ao parâmetro–output define o diretório de destino onde nosso JRE personalizado deve ser gerado.
3.4. Executando um aplicativo com a imagem gerada
Agora, temos nosso JRE personalizado criado porjlink.
Para testar nosso JRE, vamos tentar executar nosso módulo navegando dentro da pastabin de nosso diretóriocustomjre e executar o comando abaixo:
java --module jlinkModule/com.example.jlink.HelloWorld
4. Criando JRE customizado com scripts do iniciador
Opcionalmente,we can also create a custom JRE with executable launcher scripts.
Para isso, precisamos executar o comandojlink que tem umextra –launcher parameter to create our launcher with our module and main class:
jlink --launcher customjrelauncher=jlinkModule/com.example.jlink.HelloWorld
--module-path "%JAVA_HOME%\jmods";out
--add-modules jlinkModule
--output customjre
Isso irá gerar dois scripts:customjrelauncher.bat ecustomjrelauncher inside nosso diretóriocustomjre/bin.
Vamos executar o script:
customjrelauncher.bat
E a saída será:
Mar 18, 2019 12:34:21 AM com.example.jlink.HelloWorld main
INFO: Hello World!
5. Conclusão
Neste tutorial, aprendemos como we pode criar um JRE modular personalizado comjlink que contém apenas os arquivos mínimos necessários para o nosso módulo. Também analisamos como criar um JRE personalizado com scripts do iniciador que podem ser facilmente executados e enviados.
Imagens de tempo de execução Java modulares e personalizadas são poderosas. The goals for creating custom JREs are clear: they save on memory, improve performance, and also enhance security and maintainability. JREs personalizados leves também nos permitem criar aplicativos escaláveis para dispositivos pequenos.
Os trechos de código usados neste tutorial sãoavailable over Github.