Boa tarde!Há pouco tempo, o novo Java 14. foi lançado. Entre muitos recursos interessantes, eu estava interessado em um, a saber, o empacotador jpackage (enquanto estava na incubadora).O significado desse recurso é levar nosso aplicativo, todas as dependências e tempo de execução, e montar um arquivo de instalação fácil de distribuir, instalar e executar.A descrição de como usar a ferramenta está no artigo .Depois de brincar com o empacotador, eu queria tentar implementá-lo no meu projeto de estimação.Desde que o projeto foi escrito usando o Maven, foi decidido escrever um plugin. Como é a primeira vez que escrevo um plug-in para o Maven, essa tarefa se tornou duplamente interessante para mim.Após pesquisar no tópico sobre plugins, ficou claro que não é difícil escrevê-los: eu herdei da classe AbstractMojo , implementei o método void execute () , desliguei a anotação Mojo e o plug-in está pronto.O resultado é um espaço em branco:@Mojo(name = "createpackage", defaultPhase = LifecyclePhase.VERIFY, threadSafe =true)
public class JpackageMojo extends AbstractMojo {
@Override
public void execute() {
}
}
"Createpackage" é o nome do destino;“LifecyclePhase.VERIFY” - será executado na verificação.Para criar o instalador .exe, você deve executar o comando:jpackage --name myapp --input lib --main-jar main.jar
Ou seja, você precisa especificar o nome do arquivo na saída, a pasta com o aplicativo e especificar o dzharnik com o método principal. Para obter esses dados, adicione as seguintes linhas à classe:@Parameter(defaultValue = "${project.build.directory}")
private File buildDirectory;
@Parameter( defaultValue = "${project}", readonly = true )
private MavenProject project;
A documentação diz que a ferramenta está disponível através do java.util.spi.ToolProvider.findFirst ("jpackage") , mas não foi possível usá-la. Talvez isso se deva ao fato de o jpackage estar na incubadora. Se alguém souber a solução, compartilhe nos comentários.Bem, como não podemos fazer isso lindamente, faremos isso feio, por meio de Runtime.getRuntime (). Exec (command). Para simplificar, sugeri que o jpackage.exe fosse adicionado às variáveis de ambiente.O comando resultante para executar:jpackage.exe --name name --input path --main-jar main --dest dest --win-menu --win-shortcut
onde mais algumas opções são adicionadas : --dest dest indica o local do resultado, --win-menu --win-shortcut adiciona links para mim e para a área de trabalho no Windows.Como resultado, obtive o seguinte:@Mojo(name = "createpackage", defaultPhase = LifecyclePhase.VERIFY, threadSafe = true)
public class JpackageMojo extends AbstractMojo {
public static final String ERROR_CREATE_PACKAGE = "Error create package";
@Parameter(defaultValue = "${project.build.directory}")
private File buildDirectory;
@Parameter( defaultValue = "${project}", readonly = true )
private MavenProject project;
@Override
public void execute() {
var name = project.getArtifactId();
var path = buildDirectory.getPath();
var main = project.getArtifact().getFile().getName();
var dest = path + "\\dest";
try {
String command = "jpackage.exe --name " + name + " --input "
+ path + " --main-jar " + main + " --dest " + dest
+ " --win-menu --win-shortcut";
getLog().debug(command);
Process proc = Runtime.getRuntime().exec(command);
getLog().info(Arrays.toString(proc.getInputStream().readAllBytes()));
proc.waitFor();
proc.destroy();
} catch (IOException e) {
getLog().error(ERROR_CREATE_PACKAGE, e);
} catch (InterruptedException e) {
getLog().error(ERROR_CREATE_PACKAGE, e);
Thread.currentThread().interrupt();
}
}
}
No projeto, você pode se conectar adicionando as seguintes linhas ao pom.xml<plugin>
<groupId>org.sterzhen</groupId>
<artifactId>jpackage-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<executions>
<execution>
<goals>
<goal>createpackage</goal>
</goals>
</execution>
</executions>
</plugin>
Ao testar o plug-in em um projeto de estimação, houve mais uma surpresa, a saber, para o empacotador funcionar no Windows, é necessário instalar o WiX 3.0 ou posterior.Depois de instalar o WiX, o plugin funcionou, o que me trouxe a alegria de uma pequena vitória. Sim, embora seja primitivo e funcione apenas para Windows, mas este é apenas o começo.Ficarei feliz em ouvir comentários e sugestões.O código fonte pode ser encontrado no link.Documentação:http://openjdk.java.net/jeps/343https://docs.oracle.com/en/java/javase/14/docs/specs/man/jpackage.htmlhttps://docs.oracle. com / pt / java / javase / 14 / jpackage / packaging-overview.htmObrigado!