Java Artifacts刚刚变得更好:jpackage在Java 16中已经可以用于生产

JDK (Java Development Kit) 14在Java工具包中增加了一个孵化特性——能够打包一个自包含的Java应用程序。新发布的Java 16将其投入生产,您将了解它的全部内容。
如果你一想到针对不同平台的编译就不寒而栗,我知道这种感觉。Java的承诺之一,WORA (Write Once, Run Anywhere)原则,在彻底改变平台独立性的同时,还缺少了一个步骤——能够在任何地方部署。就我个人而言,我认为WORADA听起来很棒,但我猜在Docker出现之前,人们没有想到消除“在我的机器上工作”就像发货你的机器一样简单。
你写了一个类,建立了一个jar文件,然后你需要正确的JVM(或JDK)和所有正确的依赖关系,以一种非常特殊的方式组织,以便使它工作。这些知识完整无缺地从开发竖井转移到运维竖井的可能性有多大?
“运送你的机器”集装箱革命
容器改变了一切。虽然在过去的几年里,“我很难部署Java应用程序”的抱怨是“好吧,至少它在每个平台上都能运行,其他所有东西都不能这样做”,但Docker和容器的兴起把“至少它是多平台的”的论点从水里吹走了。突然之间,多平台支持变得不那么重要了(因为您发布的是目标平台),但是拥有一个包含整个应用程序的包就成了赢家。
认识一下jpackage,原生Java应用程序安装生成器
Docker第一次发布仅仅4年JEP 311: Java Packager API和CLI见天日了。我们的想法是采用旧的和废弃的javapackager工具(它的目标是“作为Ant任务的替代品”——这是Oracle官方文档中的引用,我不骗你!)清理它,记录它,提供适当的API,并允许Java开发人员创建适当的安装程序。取而代之的是JEPs 343和392:包装工具在Java 16版本中,这是一个干净的重写,非常棒。开始吧:
$ jpackage create-installer——runtime-installer \——name——output outputdir
嘣,您刚刚创建了一个安装程序(msi / .exe1,dmg,或. deb / rpm程序),包括一切(你的应用程序,你的依赖,整个JRE,和厨房水槽)。
一切吗?听起来很多!
确实如此!但你真的不必把所有东西都打包。运行如下命令创建一个只包含应用程序的可执行文件:
$ jpackage——name myapp——input lib——main-jar main.jar \——main类myapp。主要
该包将包括应用程序的启动器,也称为myapp.要启动应用程序,启动器将把从输入目录复制的每个JAR文件放在JVM的类路径上。
嘿,我的JRE去哪儿了?!
但. .但. .我们排除了JRE,难道不是违背了整个目的吗?是的,我们做了。让我们找到一个中间的方法,包括JRE,但不是全部。您可以使用jlink命令来创建JRE的一个子集,只包括你真正需要的模块:
$ jlink—添加模块java.base,java。SQL——输出smalljre
现在您有了一个自定义的(很小的)JREsmalljre.让我们用它来创建一个安装程序,而不是整个野兽:
$ jpackage——name myapp——input lib——main-jar main.jar \——runtime-image smalljre
不是jpackage很酷?它是!它会取代Docker吗?不是真的。它真的是要取代Docker吗?不。那么,原因是什么呢?现在我们有了一个独立的Java应用程序,我们可以到处运行。
在任何地方获取Java包
很好,我们创造了一个很棒的包。现在怎么办呢?这要看这个包裹是什么。这里有一些选择:
- 这是一个可下载的桌面应用程序。在这种情况下,您需要云分发服务。JFrog平台提供了一个免费云账号这就是它的作用。您可以将Java包部署到通用回购,并让人们将其下载到他们的设备上。
- JFrog平台还可以作为Debian和rpm包存储库类型,因此您可以在本地托管和服务您的Debian和rpm Java包!
- 如果您想进一步改善分发体验,JFrog平台的其他订阅级别包括CDN(内容分发网络)支持在世界任何地方提供更好的下载速度。
- 它是Docker图像的一部分。既然这样,那就拿个免费的吧JFrog货柜注册处用于自托管或在JFrog平台上开放一个免费的云帐户。在这两种情况下,您都可以为Docker映像获得一个免费的Docker注册表,以及一个用于这些映像内容的通用存储库,即我们的Java包。接下来,一个简单的ADD指令将复制一个文件- Java包到您的映像,保持Dockerfile干净、简单和整洁。
Java 16 -应用程序简化
获取所有jar,添加任何JRE,用一个简单的命令将它们打包在一起,突然之间,每个Java新手的问题“我如何从这堆乱糟糟的东西中创建一个应用程序”都成为了现实,这要感谢jpackage。对象的任何目标或最终用户都可以访问JFrog平台你有一个成功的组合!
在这篇博客文章中阅读更多关于Java 16发布以及它如何影响Java社区的信息:
Java 16提交到Git和GitHub:个人反思
Java®是Oracle和/或其关联公司的注册商标。
