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

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

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

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

相关文章

Linux 命令之 getent -- 查看记录

文章目录命令介绍常用选项参考示例查看文件 /etc/protocols 中的所有记录查看指定用户组是否存在,若不存在则创建指定的用户组根据主机名称,查看对应的IP地址根据域名查找对应的IP根据用户名查找对应的UID获取当前登陆用户的信息根据UID查找用户名查找那…

运行SpringBoot时:Type javax.xml.bind.JAXBContext not present

原因和简单介绍 我有一些代码使用JAXB API类,它们是作为Java 6/7/8中JDK的一部分提供的。当我使用Java 9运行相同的代码时,在运行时我得到错误,指示无法找到JAXB类。 自Java 6以来,JAXB类已作为JDK的一部分提供,为什么…

Linux 命令之 chfn -- 修改用户信息

文章目录命令简介常用选项参考示例改变用户 root 的 finger 信息命令简介 chfn 命令的英文全称是 change finger,即用来改变 finger 命令显示的信息。这些信息都存放在 /etc/passwd 文件里。若不指定任何选项,则chfn 命令会进入问答式界面。 常用选项 …

cassandra可视化_容器化Spring Data Cassandra应用程序

cassandra可视化我正在继续学习Docker的旅程。 在这一点上,我仍然保持简单。 这次,我将解决将Spring和Cassandra应用程序转换为使用容器而不是在主机上本地运行的问题。 更确切地说,使用Spring Data Cassandra整理应用程序。 我希望我前几天…

自定义Mybatis框架

一、开发环境的准备及统一 1、 Jdk环境&#xff1a;JDK 1.8 64bit 2、 Maven环境&#xff1a;MAVEN 3.3.9 二、创建Maven工程并引入坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

Linux 命令之 userconf -- 设置用户账号

文章目录命令介绍常用选项参考示例新增用户账号新增群组删除用户账号删除群组命令介绍 userconf的命令全称是“user config”&#xff0c;该命令是用户账号设置程序。 userconf实际上为linuxconf的符号连接&#xff0c;提供图形界面的操作方式&#xff0c;供管理员建立与管理各…

javafx 动画没效果_通过JavaFX标注制作动画效果

javafx 动画没效果在本文中&#xff0c;您将学习如何使用JavaFX的动画API创建标注。 您可以在https://www.youtube.com/watch?vXTHbB0LRdT4的 YouTube网站上查看这些标注的演示示例。 什么是标注&#xff1f; 我敢肯定&#xff0c;您已经看过广告或科幻电影&#xff0c;它们使…

基于自定义Mybatis框架实现数据库操作

一、场景模拟 基于自定义Mybatis框架和已有的Mysql数据库Mybatis&#xff0c;查询所有用户信息。 二、创建工程并引入自定义Mybatis框架的坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0…

javafx按钮设计风格_Java,JavaFX的流畅设计风格按钮,切换按钮和工具提示

javafx按钮设计风格你好&#xff0c;我们又见面了&#xff01; 这个周末&#xff0c;在业余时间&#xff0c;我继续从事JMetro的工作。 最终结果是新的Button和ToggleButton深色和浅色样式。 这些新样式包括按下按钮时的新动画。 可以通过CSS打开和关闭。 最后&#xff0c;我…

MySQL数据库变量_数据库参数_MySQL变量_系统变量_用户变量

文章目录MySQL 变量分类系统变量查看系统变量设置系统变量如何通过配置文件来设置变量值通过命令行选项来设置变量值动态设置全局级的系统变量设置静态的系统变量设置会话级的系统变量引用系统变量总结用户自定义变量用户变量声明定义用户变量查看用户变量的值参考示例使用命令…

Mybatis框架快速入门

一、场景模拟 基于自定义Mybatis框架和已有的Mysql数据库Mybatis&#xff0c;查询所有用户信息。 二、创建工程并引入Mybatis框架的坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

oidc_使用Java EE和OIDC构建Java REST API

oidc“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Java EE允许您使用JAX-RS和JPA快速轻松地构建Java REST API。 Java EE是保护伞标…

Mybatis实现CRUD操作

项目实现的功能 查询所有用户信息 通过Id查询用户信息 添加用户&#xff08;回显主键&#xff09; 修改用户信息 删除用户信息 通过用户名字模糊查询 一、引入依赖和工程结构 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http…

Linux系统下MySQL的导出数据语句SELECT … INTO OUTFILE的用法

文章目录关于参数 secure_file_priv按默认参数设定导出表数据到文本文件中自定义分隔符&#xff0c;将表数据导出到 txt 文件中自定义分隔符&#xff0c;将表数据导出到 csv 文件中导出数据时&#xff0c;提示“拒绝访问”总结确保 Linux 用户 mysql 对导出的目标目录拥有写入和…

java cxf_拥抱模块化Java平台:Java 10上的Apache CXF

java cxfJava 9版本终于将Project Jigsaw交付给大众已经过去了一年的时间。 这是一段漫长的旅程&#xff0c;但是在那里&#xff0c;所以发生了什么变化&#xff1f; 这是一个很好的问题&#xff0c;答案并不明显和直接。 总的来说&#xff0c; 拼图项目是一种颠覆性的变化&am…

MySQL数据字典

数据字典就类似于系统编目或花名册&#xff0c;它保存数据库服务器上的元数据信息&#xff08;数据库的整体属性信息&#xff09;。 元数据信息包括&#xff1a;数据库的属性信息、数据表的属性信息、字段的属性信息、视图的属性信息、用户信息、统计类信息等。 MySQL 保存元…

Mybatis映射文件SQL语句模糊查询,#和$的区别和注意事项

Mybatis映射文件SQL语句模糊查询 1. “%”#{value}"%" 在参数中不需要添加 %_ 推荐使用 2. ‘%${value}%’ 在参数中不需要添加 %_ 3. #{abc} 在参数中添加 %_ #和$的区别和注意事项 ${}直接拼接 &#xff0c;不会转换类型 如果是简单类型&#xff0c;必须写${…

启动php-fpm服务器_无服务器冷启动不是问题-这就是为什么(对于大多数应用程序)...

启动php-fpm服务器从无服务器开始时&#xff0c;您很快就会学习/听到有关函数冷启动的信息&#xff08;我相信无服务器云功能 API &#xff09;。 首次调用云功能时或长时间不调用后会发生冷启动。 基本上&#xff0c;服务器&#xff08;是的&#xff0c;有服务器&#xff01;&…

声明定义存储过程或者函数时,其中的 delimiter 关键字是干嘛的呢?

我们写 SQL 的时候&#xff0c;MySQL 怎么判断 SQL 是否已经结束了&#xff0c;可以去执行了&#xff1f; 需要一个结束符&#xff0c;当 MySQL 看到这个结束符的时候&#xff0c;表示可以执行前面的语句了&#xff0c;MySQL 默认以分号为结束符。 当我们创建存储过程或者自定…

istio api_Istio的网络API解释了

istio apiIstio 1.0版附带一个网络API&#xff0c;该API包含许多功能并涵盖了各种场景。 联网API在最近几个月中得到了发展&#xff0c;并且可能不会立即说明。 该API的概念和构建块是什么&#xff0c;以及如何使用各个Istio资源类型来通过我们的服务网格路由流量&#xff1f; …