graalvm

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

graalvm

graalvm_GraalVM上的Picocli:极快的命令行应用程序相关推荐

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

    GraalVM GraalVM允许您提前将程序编译为本地可执行文件. 与Java VM相比,生成的程序具有更快的启动时间和更低的运行时内存开销. 这对于通常是短暂的命令行实用程序尤其有用. Graal ...

  2. Linux上传文件和下载文件命令行方式

    在Linux主机上,安装上传下载工具包rz及sz 只需要安装下面这个包即可,执行下面的安装命令 yum install -y lrzsz 上传 在Linux命令行下输入rz, rz 1 输入rz命令后 ...

  3. 手把手教你用delphi 10.2.3 在windows上编译Centos 7下的命令行程序,适合中小学生

    手把手教你用delphi 10.2.3 在windows上编译Centos 7下的命令行程序,适合中小学生 1.下载并安装     a)下载:delphicbuilder10_2_3_2631.iso ...

  4. golang 命令行_如何使用Golang编写快速有趣的命令行应用程序

    golang 命令行 by Peter Benjamin 彼得·本杰明(Peter Benjamin) 如何使用Golang编写快速有趣的命令行应用程序 (How to write fast, fun ...

  5. react 让滚动条一直在下面_Ink 2.0 发布:命令行应用程序的 React

    作者 | Bethany Griggs.Michael Dawson译者 | 无明 自称为"命令行接口 React"的 JavaScript 库 Ink 最近发布了第二个主要迭代版 ...

  6. Android AM命令行启动程序的方法

    在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am. 启动的方法为 wangwei@wwG41D3:~$ adb shell       $ su # am ...

  7. 使用.NET Core快速开发一个较正规的命令行应用程序

    程序员的世界,命令行工具一直是"体验非常友好"的工具,也能自动化完成很多事情,同时还能结合shell来进行某项任务的批处理(脚本).在.NET Core中,命令行应用程序是基础,但 ...

  8. 在Android命令行启动程序的方法

    在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am.启动的方法为 # am start -n 包(package)名/包名.活动(activity)名称 启动 ...

  9. nodejs命令行执行程序_在NodeJS中编写命令行应用程序

    nodejs命令行执行程序 by Peter Benjamin 彼得·本杰明(Peter Benjamin) 在NodeJS中编写命令行应用程序 (Writing Command-Line Appli ...

最新文章

  1. 025_JDK的hashCode方法
  2. 【风险管理】风控决策系统
  3. The directory '*' or its parent directory is not owned by the current user
  4. poj 1067 取石子游戏(博弈+威佐夫博奕(Wythoff Game))
  5. API生态的发展与机遇:从5000组数据看中国API生态与开发者现状
  6. hyper-v 安装centos7 后,虚拟机无法访问网络。
  7. 入门第十课 Python语句的编写之while
  8. Android已读未读功能,Android实现小圆点显示未读功能
  9. 二叉树遍历算法之三:后序遍历
  10. G面经prepare: BuyGoods
  11. 网页CSS常用中英文字体收集
  12. 链队列——-链式存储实现队列的入队出队(带next,front,rear指针)
  13. 小精灵无尽的长廊_神奇宝贝之无尽系统
  14. MY9221 使用心得
  15. (附源码)计算机毕业设计SSM基于的英语学习网站的设计与实现
  16. 仓储管理之计价方法——个别计价法
  17. 【PC用户请留步】流氓软件卸载不了,卸载后有残留,这个软件帮你搞定!
  18. 送你一份2023Java学习路线,按图索骥,开启一路狂飙!
  19. Nginx与服务器集群
  20. matlab 好玩的程序,MATLAB中几个比较有用的程序

热门文章

  1. [骗分技巧——随机化Ⅰ]CodeChef-Milestones,CF364D-Ghd
  2. 树的同构模板题(法1.最小表示法+法2.树哈希)
  3. AT2161-[ARC065D]シャッフル/Shuffling【dp】
  4. P3224 [HNOI2012]永无乡(并查集+权值线段树合并/平衡树)
  5. 2018 ACM ICPC Asia Regional - Seoul B.Cosmetic Survey
  6. 【dfs】无穷迷宫(jzoj 3924)
  7. 汇编语言(一)之反转字符串输出
  8. 学习分布式不得不会的BASE理论
  9. Mybatis简介与原理
  10. Eclipse下导入外部jar包的3种方式