日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GraalVM上的Picocli:极快的命令行应用程序

發布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.Example

reflect.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:极快的命令行应用程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。