当前位置: 首页 > 工具软件 > JPackage > 使用案例 >

jpackage在Java 16中可以投入生产

严扬
2023-12-01

JDK 16具有打包自包含Java应用程序的功能。

如果您不停地考虑针对不同平台进行编译,我会感觉到。Java的承诺之一就是WORA(一次写入,可在任何地方运行)原理,在彻底改变平台独立性的同时,又停止了一步,那就是能够在任何地方进行部署。就个人而言,我认为WORADA听起来很棒,但我想在Docker之前人们还没有意识到消除“我的机器上的工作”就像运送机器一样简单。

因此,您编写了一个类,构建了一个jar文件,然后需要正确的JVM(或JDK)和所有正确的依赖项,它们以非常特殊的方式进行组织才能使其正常工作。有哪些机会可以将这些知识完整地从Dev筒仓完整地转移到Ops筒仓?

“运送您的机器”容器革命

容器改变了一切。尽管在过去的几年中,“我至少很难在每个平台上运行,但其他一切甚至都没有做到”,抱怨“我在部署Java应用程序上遇到了很大的麻烦”,但Docker和容器的兴起使“至少它是多平台的”论点。突然之间,多平台支持就没有那么重要了(因为您已经交付了目标平台),但是有了一个软件包,其中将包含整个应用程序,这是一个赢家。

认识jpackage,本机Java App安装程序生成器

在Docker JEP 311首次发布仅4年后:Java Packager API和CLI才刚刚起步。这个想法是采用旧的废弃的Javapackager工具(其目标是“用作Ant任务的替代品”,这是Oracle官方文档的引文,我不告诉你!)清理,记录下来,提供适当的API,并允许Java开发人员创建适当的安装程序。在Java 16发行版中,它已被JEP 343和392:打包工具所取代,这是一个干净的重写,而且很棒。开始了:


$ jpackage create-installer --runtime-installer \
    --name  --output outputdir

Boom,您刚刚创建了一个包含所有内容的安装程序(.msi/.exe1,.dmg或.deb/.rpm)(您的应用程序,您的依赖项,整个JRE和厨房水槽)。

一切?听起来很多!

确实是!但是,您不必真正打包所有东西。运行以下内容,以仅使用您的应用程序创建可执行文件:

$ jpackage --name myapp --input lib --main-jar main.jar \
    --main-class myapp.Main

该软件包将包括该应用程序的启动器,也称为myapp。要启动该应用程序,启动程序会将从输入目录复制的每个JAR文件放在JVM的类路径上。

嘿,我的JRE去哪了?

但是…但是…我们不是通过排除JRE来破坏整个目标吗?是的我们做了。让我们通过包含JRE(但不是全部)找到一种中间方法。您可以使用该jlink命令创建JRE的子集,仅包括您真正需要的模块:

$ jlink --add-modules java.base,java.sql --output smalljre

现在,您有了一个自定义(且很小)的JRE smalljre。让我们用它来创建一个安装程序,而不是整个野兽:

$ jpackage --name myapp --input lib --main-jar main.jar \
    --runtime-image smalljre

不jpackage酷吗?它是!它会取代Docker吗?并不真地。真的是要替换Docker吗?不,那有什么作用?好了,现在我们有了一个独立的Java应用程序,我们可以在任何地方运行。

将Java软件包带到任何地方

太好了,我们创建了一个很棒的程序包。怎么办?好吧,这取决于此程序包是什么。这里有几个选择:

这是一个可下载的桌面应用程序。在这种情况下,您需要一个云分发服务。JFrog Platform提供了一个完全可以做到这一点的 免费云帐户。您可以将Java程序包部署到通用存储库,然后让人们将其下载到他们的设备中。
JFrog Platform还可用作Debian和rpm软件包存储库类型,因此您可以本地托管和服务Debian和rpm Java软件包!
如果您想进一步改善发行体验,则其他JFrog Platform订阅级别包括 CDN(内容交付网络)支持,该支持可在世界任何地方提供更好的下载速度。
它是Docker映像的一部分。在这种情况下,请获取免费的 JFrog容器注册表进行自我托管,或者在JFrog平台上打开免费的云帐户。在这两种情况下,您都会获得一个免费的Docker映像的Docker注册表,以及一个用于这些映像的内容的通用存储库,即我们的Java包。接下来,一条简单的ADD指令将一个文件– Java包复制到您的映像中,从而使Dockerfile保持整洁,简单和整洁。

参考: 《2020最新Java基础精讲视频教程和学习路线!》

 类似资料: