下午好!不久前,新的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/343https://docs.oracle.com/en/java/javase/14/docs/specs/man/jpackage.htmlhttps://docs.oracle。 com / en / java / javase / 14 / jpackage / packing-overview.htm谢谢!