Java 14的JPackage Maven插件

下午好!

不久前,新的Java 14发布了,在许多有趣的功能中,我感兴趣的一个就是jpackage packer(在孵化器中)。

此功能的含义是获取我们的应用程序,所有依赖项和运行时,并组装一个易于分发,安装和运行的安装文件。

有关如何使用该工具的说明,请参见本文

与打包机一起玩后,我想尝试在我的宠物项目中实现它。由于该项目是使用Maven编写的,因此决定编写一个插件。由于这是我第一次为Maven编写插件,因此这个任务对我来说变得倍加有趣。

在搜索了插件主题之后,很明显地写出它们并不困难:我继承了AbstractMojo,实现了void execute()方法,悬挂了Mojo批注,并且插件已准备就绪。

结果是如此空白:

@Mojo(name = "createpackage", defaultPhase = LifecyclePhase.VERIFY, threadSafe =true)
public class JpackageMojo extends AbstractMojo {

   @Override
   public void execute() {
        //    .
   }
}

“ Createpackage”是目标的名称;
“ LifecyclePhase.VERIFY” -将在验证时执行。

要构建.exe安装程序,必须运行以下命令:

jpackage --name myapp --input lib --main-jar main.jar

也就是说,您需要在输出中指定文件名,在应用程序中指定文件夹,并在main方法中指定dzharnik。要获取此数据,请在类中添加以下行:

@Parameter(defaultValue = "${project.build.directory}")
private File buildDirectory;
@Parameter( defaultValue = "${project}", readonly = true )
private MavenProject project;

文档说该工具可通过java.util.spi.ToolProvider.findFirst(“ jpackage”)获得,但我无法使用它。也许这是因为jpackage位于培养箱中。如果有人知道解决方案,请分享评论。

好吧,由于我们做不到精美的外观,因此我们会通过Runtime.getRuntime()。Exec(命令)来进行丑陋的处理。为简单起见,我建议将jpackage.exe添加到环境变量中。

执行的结果命令:

jpackage.exe --name name --input path --main-jar main --dest dest --win-menu --win-shortcut

其中添加了几个标志:--dest dest表示结果的位置,-- win -menu --win-shortcut将链接添加到我和Windows的桌面中。

结果,我得到以下信息:

@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();
       }
   }
}

在项目中,可以通过将以下行添加到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>

在宠物项目上测试插件时,还有一个惊喜,即要使打包程序在Windows中运行,必须额外安装WiX 3.0或更高版本。

安装WiX之后,该插件正常工作,这给我带来了小胜利的喜悦。是的,虽然它很原始并且仅适用于Windows,但这只是开始。

我很高兴听到您的意见和建议。

可以在链接中找到源代码。

文档:

http : //openjdk.java.net/jeps/343
https://docs.oracle.com/en/java/javase/14/docs/specs/man/jpackage.html
https://docs.oracle。 com / en / java / javase / 14 / jpackage / packing-overview.htm

谢谢!

All Articles