Capsule:支持容器的JVM應用程序打包部署工具

jopen 9年前發布 | 8K 次閱讀 Capsule


盡管JVM應用程序對環境的依賴非常小,但讓人奇怪的是,現在并沒有一種通用又好用的JVM應用程序部署工具。Fat JAR不支持本地庫,而且需要特定于平臺的腳本。Docker太笨重,而且作為一個運行時無關的工具,無法利用JVM的優勢。近日,Parallel Universe宣布Capsule 1.0正式發布。這是一個簡潔、健壯而又不失靈活的開源JVM應用程序部署工具。它可以用于部署桌面應用程序、微服務或復雜的Web應用程序,而且不僅支持Java應用程序,還支持其它所有的JVM語言,如JRubyJythonGroovyClojureOCaml-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網站用戶指南

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!