尽管 JVM 应用程序对环境的依赖非常小,但让人奇怪的是,现在并没有一种通用又好用的 JVM 应用程序部署工具。 Fat JAR 不支持本地库,而且需要特定于平台的脚本。 Docker 太笨重,而且作为一个运行时无关的工具,无法利用 JVM 的优势。近日, Parallel Universe 宣布, Capsule 1.0 正式发布。这是一个简洁、健壮而又不失灵活的开源 JVM 应用程序部署工具。它可以用于部署桌面应用程序、微服务或复杂的 Web 应用程序,而且不仅支持 Java 应用程序,还支持其它所有的 JVM 语言,如 JRuby 、 Jython 、 Groovy 、 Clojure 、 OCaml-Java 等。用户可以将它视为一个增强版的 Fat JAR 和一个一体的声明式启动脚本;也可以将它视为构建工具伴侣,构建工具负责构建,而它负责应用程序构建与启动之间的事情。Capsule 主要遵循如下设计原则:
- 打出的包要小、可移植、便捷:不管多复杂的 JVM 应用程序,经过 Capsule 打包后都只会生成一个名为 capsule(注:Capsule 指工具本身,capsule 指由该工具生成的包)的可在所有平台上执行的 JAR 包。capsule 可以直接包含所有的应用程序依赖,也可以仅仅声明部分或全部依赖,并在启动时下载。capsule 本身也可以存放在 Maven 库中,然后在启动时下载。
- 最小化安装 JVM 应用程序对主机系统的影响,并提供更新支持选项:capsule 首次安装时会在一个临时目录中创建一些文件,用户可以随时删除这些文件,并不会带来不良影响。capsule 也可以根据需要查找更新。
- 启动必须有确定性,同时要灵活、安全,可以施加限制:启动 capsule 不需要脚本。它会自行查找所需的 JVM 版本,设置 classpath 和必要的代理及 JVM 标识。capsule 在启动时还可以创建自己的容器。JVM 应用程序可以在这个没有特权的容器中运行,并由 JVM 的安全机制提供安全保障。而且,所有这些功能都可以通过 _caplets_ 进行编程和组合。
- 如果现有的工具满足要求,就不创建新的工具和标准:Capsule 使用 Java 编写,可以用 Java 扩展。capsule 被打包在一个可执行的 JAR 包中,所有的元数据均以 JAR-manifest 属性的形式存储。同其它所有构建工具插件一样,capsule 本身就是一个简单的 Maven 依赖项。
Capsule 能在提供所有这些功能的同时保持简洁,主要得益于 _ caplets _。用户可以使用它们定制 capsule 的行为。_Caplets_ 可以嵌入到 capsule 中,也可以单独打包。 Maven caplet 是 Capsule 的第一个 caplet。它允许用户在 manifest 属性中声明应用程序的部分或全部依赖,而不用将它们嵌入到 capsule JAR 中。让我们看一个例子,这是一个简单的Hello World Servlet。构建完成后,它会创建一个标准的WAR 文件。该文件可以部署到任何Servlet 容器,其内容如下:
247 META-INF/MANIFEST.MF 1124 WEB-INF/classes/co/paralleluniverse/examples/HelloWorldServlet.class 653 WEB-INF/web.xml 161596 Capsule.class 1467463 capsule-maven-1.0.jar
可以看到,WAR 文件中包含Capsule类,表明该文件是一个 capsule。它还嵌入了一个 JAR 包 capsule-maven-1.0.jar,这是一个 Maven caplet,其 JAR manifest 文件内容如下:
Manifest-Version: 1.0 Main-Class: Capsule Premain-Class: Capsule Caplets: co.paralleluniverse:capsule-maven:1.0 Application: org.eclipse.jetty:jetty-runner:9.3.3.v20150827 Allow-Snapshots: true Min-Java-Version: 1.7.0 Args: $CAPSULE_JAR
如果该 capsule 真正执行,那么它会自动下载 Jetty ,并使用它启动该 Servlet。此外,Capsule 还提供了如下 caplet:
- 守护进程 caplet :将 capsule 作为一个 Unix 守护进程或 Windows 服务启动;
- 安全 caplet :在 Java 沙箱中启动 capsule;
- 桌面 caplet :将一个包含 GUI 应用程序的 capsule 转换成一个原生可执行程序;
- 容器 caplet :在容器中运行 capsule。
此外,与 Docker 相比,capsule 容器更轻量级,构建速度更快。而且,由于 capsule 在没有特权的容器中运行,所以更安全:在容器中进行 root 访问不会转变成主机上的 root 访问。借助 Shield caplet (即安全 caplet),使用如下代码就可以让 Web 应用程序 quasar-stocks 在容器中运行:
java -jar capsule-shield-0.1.0.jar quasar-stocks-thin.jar
要了解更多信息,请查看 Capsule 网站和用户指南。
感谢郭蕾对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。
评论