GraalVM上的Picocli:极快的命令行应用程序
GraalVM
GraalVM允許您提前將程序編譯為本地可執行文件。 與Java VM相比,生成的程序具有更快的啟動時間和更低的運行時內存開銷。 這對于通常是短暫的命令行實用程序尤其有用。
GraalVM對Java反射的支持有限,它需要提前了解反射訪問的程序元素。
反射訪問
Picocli當前使用反射來發現用@Command注釋的類和方法 ,以及用@Option和@Parameters以及其他picocli注釋注釋的field , 方法或方法參數 。 未來的picocli版本可能會包含注釋處理器,以在編譯時完成此工作,但就目前而言,它使用了反射。
ReflectionConfigGenerator工具
Picocli 3.7.0包含picocli-codegen模塊 ,以及一個可生成GraalVM配置文件的工具。
ReflectionConfigGenerator生成帶有程序元素的JSON字符串,該元素將在基于picocli的應用程序中進行反射訪問,以便提前將該應用程序編譯為GraalVM的本機可執行文件。
ReflectionConfigGenerator的輸出旨在傳遞給本native-image GraalVM實用程序的-H:ReflectionConfigurationFiles=/path/to/reflectconfig選項。 這允許將基于picocli的應用程序編譯為本機映像。
用法示例
我們將使用picocli.codegen.aot.graalvm.Example類是用于測試picocli-codegen模塊為例。 首先,我們將使用ReflectionConfigGenerator工具生成一個reflect.json配置文件。 接下來,我們將Example類編譯為一個本機應用程序,最后,我們將運行此應用程序,并查看本機應用程序與在Hotspot上運行之間的啟動時間有何不同。
生成配置文件
運行ReflectionConfigGenerator工具,并指定@Command類的一個或多個完全合格的類名稱。 輸出將打印到System.out ,因此您將需要將其重定向到文件:
java -cp \ picocli-3.7.0.jar:picocli-codegen-3.7.0-tests.jar:picocli-codegen-3.7.0.jar \ picocli.codegen.aot.graalvm.ReflectionConfigGenerator picocli.codegen.aot.graalvm.Example > reflect.json生成的reflect.json文件如下所示:
[{"name" : "picocli.codegen.aot.graalvm.Example","allDeclaredConstructors" : true,"allPublicConstructors" : true,"allDeclaredMethods" : true,"allPublicMethods" : true,"fields" : [{ "name" : "spec" },{ "name" : "unmatched" },{ "name" : "timeUnit" },{ "name" : "file" }],"methods" : [{ "name" : "setMinimum", "parameterTypes" : ["int"] },{ "name" : "setOtherFiles", "parameterTypes" : ["[Ljava.io.File;"] },{ "name" : "multiply", "parameterTypes" : ["int", "int"] }]}, ... ]| 小費 | 如有必要,可以排除具有系統屬性picocli.codegen.excludes類, picocli.codegen.excludes接受以逗號分隔的標準類名正則表達式列表,這些列表不應包含在結果JSON字符串中。 |
編譯本機映像
這假定您已安裝GraalVM,并且具有先決條件。 從站點 :
要構建程序的本機映像,請使用GraalVM發行版的bin目錄中的native-image實用程序。 要進行編譯, native-image取決于本地工具鏈,因此請確保:您的系統上可以使用glibc-devel , zlib-devel (C庫和zlib頭文件)和gcc 。
除devel軟件包外,我還需要靜態軟件包glibc-static和zlib-static 。
我們使用以下命令編譯示例類:
graalvm-ce-1.0.0-rc6/bin/native-image \-cp picocli-3.7.0.jar:picocli-codegen-3.7.0-tests.jar \-H:ReflectionConfigurationFiles=reflect.json -H:+ReportUnsupportedElementsAtRuntime \--static --no-server picocli.codegen.aot.graalvm.Examplereflect.json位于當前目錄中,我添加了-H:+ReportUnsupportedElementsAtRuntime以獲取有用的錯誤消息,以防萬一出現問題。
| 小費 | native-image --expert-options顯示未在native-image --help輸出中顯示的其他編譯選項的列表。 |
運行本機映像
如果編譯順利,我們現在在當前目錄中有一個本地可執行文件picocli.codegen.aot.graalvm.example :
$ ls -alh picocli* -rwxrwxr-x 1 remko remko 15M Oct 4 21:35 picocli.codegen.aot.graalvm.example可執行文件的名稱是從主類名稱派生的。 如果jar是可執行的jar(在清單中指定了Main-Class),則可以運行native-image [options] -jar jarfile為jar文件構建映像。
讓我們首先使用Java運行該應用程序,并為其計時,以查看啟動需要多長時間。
$ time java -cp picocli-3.7.0.jar:picocli-codegen-3.7.0-tests.jar \picocli.codegen.aot.graalvm.Example --version 3.7.0real 0m0.492s user 0m0.847s sys 0m0.070s在Java Hotspot上,大約需要半秒鐘才能運行。 現在,我們運行本機映像:
$ time ./picocli.codegen.aot.graalvm.example --version 3.7.0real 0m0.003s user 0m0.000s sys 0m0.004s現在啟動時間已降至3毫秒!
所有命令行解析功能均可以正常工作,并具有類型轉換,驗證和ANSI顏色幫助功能。 當您想用Java編寫命令行應用程序和服務并使它們即時運行時,這是令人振奮的消息。
結論
GraalVM是一項令人興奮的新技術,它允許Java程序作為本機代碼運行。 這樣可以減少內存使用和啟動時間,這對于諸如命令行實用程序之類的短期運行的程序尤其有用。
picocli-codegen模塊中包含的ReflectionConfigGenerator工具允許基于picocli的應用程序以極快的啟動時間編譯為本地可執行文件。
如果您喜歡這些項目, 請在GitHub上加注 ☆ GraalVM和picocli !
翻譯自: https://www.javacodegeeks.com/2018/11/picocli-graalvm-fast-command-apps.html
總結
以上是生活随笔為你收集整理的GraalVM上的Picocli:极快的命令行应用程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: b站电脑版稍后再看(b站电脑版稍后再看在
- 下一篇: 维迈通v8恢复出厂设置(维迈通v8怎么恢