Java工件变得更好:jpackage在Java 16中可以用于生产

jpackage在Java 16中已经可以生产了

博士TL;
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 / .exe1dmg,或. deb / rpm程序),包括一切(你的应用程序,你的依赖,整个JRE,和厨房水槽)。

使用JFrog的Artifactory DevOps工具增强您的maven构建

一切吗?听起来很多啊!

它确实是!但你不必把所有东西都打包。运行如下命令创建一个只包含你的应用程序的可执行文件:

$ jpackage——name myapp——input lib——main-jar main.jar \——main-class myapp。主要

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

嘿,我的JRE去哪儿了?!

但. .但. .排除JRE不是破坏了整个目的吗?是的,我们做到了。让我们找到一个中间的方法,包括JRE,但不是全部。你可以使用jlink命令来创建JRE的子集,其中只包括您真正需要的模块:

$ jlink——add-modules java.baseSQL——output smalljre

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

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

不是jpackage很酷?它是!它会取代Docker吗?不是真的。它真的要取代Docker吗?不。那么,发生了什么呢?现在我们有了一个独立的Java应用程序,我们可以到处运行。

在任何地方获取Java包

太好了,我们创造了一个很棒的套餐。现在怎么办呢?这取决于这个包裹是什么。这里有几个选择:

  • 这是一个可下载的桌面应用程序。在这种情况下,您需要云分发服务。JFrog平台提供了一个免费云账户就是这样。您可以将Java包部署到通用的repo,并让人们将其下载到他们的设备上。
    • JFrog平台还可以作为Debian和rpm包存储库类型,因此您可以本地托管和服务Debian和rpm Java包!
    • 如果您想进一步改善发行体验,其他JFrog平台订阅级别包括内容分发网络支持在世界任何地方提供更好的下载速度。
  • 这是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和/或其附属公司的注册商标。