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-develzlib-devel (C库和zlib头文件)和gcc

除devel软件包外,我还需要静态软件包glibc-staticzlib-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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤教育】广东开放大学 标准化理论与方法 形成性考核 (50)

选择题 题目: 我国的标准层级分为()级。 答案:看左侧 题目: 国家标准中"要求”属于必备要素,也是规范性技术要素。 答案:看左侧 题目: ,标准可分为国际标准、区域标…

【渝粤教育】广东开放大学 社会保障学 形成性考核 (34)

选择题 题目:乡政府现要对申请低保的村民张三进行资格调查,按照法律规定,不属于调查范围的是( ) 题目:我国现行《失业保险条例》所指失业人员为 ( ) 题目:《失业保险条例…

es数据频繁的更新_es之文档更新过程中并发冲突问题

1:乐观锁控制ES是分布式的,也是异步并发的,我们的复制请求是并行发送的;这就意味着请求到达目的地的顺序是不可控制的,是乱序的;如果是乱序的方式,很有可能出现这样的一个问题,新ver…

【渝粤教育】广东开放大学 网络编程技术 形成性考核 (57)

选择题 题目:在JavaScript中,运行以下代码: var flagtrue; document .write(typeof(flag)); 值是( )。 题目:下面的代码( )能在页面中弹出提示框,并且输入框中默认无任何内容 题目:在JavaScript中&#xff…

【渝粤教育】广东开放大学 金融学 形成性考核 (37)

选择题 题目:金融体系中居于联接宏微观的纽带和运作核心地位的是( ) 题目:对居民盈余与赤字的管理选择,说法正确的是( ) 题目:从形式上看,收入可分为( &a…

面试题目_总结面试中 promise 相关题目的套路

Promise 作为当下主流的异步解决方案,在工作中和面试中常常出现,尤其是在面试中,会弄个场景让你手写代码,这里给大家介绍五道比较有代表性的题目,以便熟悉一些套路。promise 简单介绍先简单介绍下 PromisePromise 对象…

javafx 自定义控件_JavaFX自定义控件– Nest Thermostat第1部分

javafx 自定义控件几周前,由于Hendrik Ebbers的出色文章 ,我决定花一些时间观看有关JavaFX的JavaOne讨论。 我不得不说我已经学到了很多东西,只是看这些视频(即使我还没有完成)! Gerrit的“使用力&#xf…

【渝粤教育】电大中专Office办公软件 (4)作业 题库

1.以下软件不属于系统软件的是( )。 A.Visual Studio 2019 B.MySQL 5.7 C.Windows 10 D.Office 2016 错误 正确答案:左边查询 学生答案:未作答 2.学习好Office办公软件这门课程,应该( )。 A.重视…

【渝粤教育】电大中专中药学基础作业 题库

试卷答案 1.首创按药物自然属性进行分类的本草著作是()。 A.《神农本草经》 B.《本草经集注》 C.《本草纲目》 D.《新修本草》 E.《本草拾遗》 正确 正确答案:左边查询 学生答案:B 2.载药数最多的本草著作是(&#xff…

不等号属于不等式吗_考研专业课备考时,仅仅多刷几遍目标院校的期末考试题就够吗?...

考研专业课备考时,仅仅多刷几遍目标院校的期末考试题就够吗?也许这要看各专业情况,部分专业的考研题和本科生的期末考试题难度类似,比如说人文社科类的专业,这也是我的猜测情况。大部分专业的专业课题目难度&#xff0…

使用Spring Boot和H2可以完全工作的原型

我们确实在弹簧上使用了很多h2,特别是对于单元测试。 但是,我们可能希望拥有一个功能齐全的原型来显示数据,而不是进行单元测试。 H2是最理想的选择,它在spring上运行良好,与大多数数据库都具有良好的语法兼容性&…

【渝粤教育】电大中专品牌管理与推广 (2)作业 题库

1通常,对品牌的排他专有性的保护手段主要是注册商标、申请专利、授权经营,等等。该说法() A正确 B错误 正确 正确答案:左边查询 学生答案:A 2品牌服务是以服务而不是以产品为主要特征的品牌,如商…

【渝粤教育】电大中专学前教育学作业 题库

1学前教育的孕育阶段的时间定位于() A21世纪 B16世纪以前 C远古时期 D18世纪 错误 正确答案:左边查询 学生答案:A 2我国封建社会第一部完整的家庭教科书《颜氏家训》出自() A陶行知 B昆体良 C颜之推 D朱熹 …

饿了吗商品列表_仅仅一字之差,饿了么起诉饿了吗

饿了么与“饿了吗”,仅仅一字之差,相信不少人乍看会以为是一家。但近日公开的一则判决书显示,因为太近似,二者曾对簿公堂。饿了吗公司以败诉收场,被判处立即变更其企业名称,变更后企业名称中不得含有与“饿…

【渝粤教育】电大中专市场营销管理 (2)作业 题库

1企业的内部环境不包括() A企业的生产能力 B财务能力 C社会文化环境 D企业在公众中的形象 错误 正确答案:左边查询 学生答案:A 2企业营销战略规划不包括哪一步骤() A确定企业的任务与目标 B选择合宜的市场机…

pandas 遍历并修改_Pandas循环提速7万多倍!Python数据分析攻略

乾明 编译整理 量子位 报道 | 公众号 QbitAI用Python和Pandas进行数据分析,很快就会用到循环。但在这其中,就算是较小的DataFrame,使用标准循环也比较耗时。遇到较大的DataFrame时,需要的时间会更长,会让人更加头疼。现…

spring消息队列_AmazonSQS和Spring用于消息传递队列

spring消息队列下一篇文章将演示如何将Spring JMS模板和DLMC与AmazonSQS API一起使用,以放置消息队列。 我为什么要使用Amazon SQS? 易于配置 跨平台支持 从您的自我冗余,连带和扩展方面的烦恼中赚钱。 为什么我不使用Amazon SQS&#x…

教程:用Java创建和验证JWT

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 Java对JWT(JSON Web令牌)的支持过去需要进行大量工作&#xf…

python用递归法写斐波那契_python实现斐波那契数列: 递归+备忘录法+动态规划实现...

1.为什么备忘录法和动态规划法:斐波那契是很多人入门递归思想的第一课,所以很多人都会最简单的一种递归写法,但是其实递归的过程,他的时间复杂度非常高,达到了O(2的n次方)这样的一个指数级别。先看最简单的&#xff1a…

【渝粤教育】电大中专电商运营实操 (2)_1作业 题库

1.电子商务最重要的是() A.商务 B.网站 C.货物 D.信息技术 正确 正确答案:左边查询 学生答案:A 2.目前菜鸟网络依赖大数据和云计算已实现了哪些功能() A.自动化仓库 B.智能发货 C.物流云加速 D.以上都正确 …