Graalvm-21 Windows初体验

前言
除了最新新出的jdk21以外,oracle还推出了重磅的graalvm-jdk-21。这个graalvm可以把java代码编译为本地执行文件,就是把原来的jar包直接打成exe。并且使用打完的exe占用的内存资源更小,启动速度更快,非常适合云平台部署,只是打包的时间比原来长了很多。实际用的话我们仍然可以在windows平台开发,将开发好的程序放到linux平台打成占用内存小、启动速度快的可执行文件。下面来介绍一下在Windows平台下安装和编译本地程序的过程。

前期准备

安装本地工具

在Windows平台编译要提前下载好相关的C++工具,可以使用Visual Stidio直接来安装。如下图:在单个组件里选下面这些。如果你使用的时Windows10,那么最后一项安装Windows10 SDK也可以。

在这里插入图片描述
下载安装完以后记得重启一下。

注意:如果后面遇到报错native-image building on Windows currently only supports target architecture: AMD64,回来把语言包的中文去掉,选上英文。

下载graalvm-jdk

现在大都使用idea进行开发,在File -->**Project Structre…**里可以直接下载,如下图所示,选graalvm-jdk-21就可以了。下载时间比较长,耐心等待一会。
在这里插入图片描述

安装完以后先别急着去改什么环境变量,我们全程在idea上操作的话是用不到这些配置的。另外网上有一些其他的教程会介绍手动安装native-image,这个也不需要,这样下载下来的jdk里是自带有的。至于native-image的作用,就是使用这个东西将java程序打成exe的。

编译Native Image

接下来介绍关键的步骤,将我们的代码编译成本地可执行文件。我们仍然不需要用什么复杂的命令,直接用idea的maven插件来完成。

创建项目

首先新建一个maven项目,结构如图所示,Test里就是经典的Hello World:
在这里插入图片描述

配置pom

接下来我们在pom.xml中换到阿里云的下载源,在最后添加上:

<pluginRepositories><pluginRepository><id>aliyun</id><name>阿里云公共仓库</name><url>https://maven.aliyun.com/repository/public</url></pluginRepository></pluginRepositories>

为了能直接使用maven插件来打包,我们需要在刚才的标签上面添加上:

<profiles><profile><id>native</id><build><plugins><plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId><version>0.9.28</version><extensions>true</extensions><executions><execution><id>build-native</id><goals><goal>build</goal></goals><phase>package</phase></execution></executions><configuration><fallback>false</fallback></configuration></plugin></plugins></build></profile></profiles>

这个是oracle的一个maven插件,有了它我们就能看到idea的maven插件变成了这样:
在这里插入图片描述

验收成果

这时候双击上图的package就能看到下面正在执行打包命令了,如果这里碰到报错native-image building on Windows currently only supports target architecture: AMD64,去上文看一下。有一说一,打包的时间还是比较长的,一个Hellow World要20s+。打完之后看一下目录结构,那个fortune.exe就是我们打出来的本地镜像了:
在这里插入图片描述
这个文件双击执行就可以了,如果看一闪而过不过瘾,可以在输出的语句上加个while循环。

这篇文章相比网上能找到的教程,我自认为更贴地气,贴近实际开发流程。前面一开始说过,我们通常是在Windows上开发,但是程序是部署在Linux上的,那么怎么能编译成Linux的可执行文件呢? 我没搜到直接在Windows上编的办法,但是可以使用native-image编译jar包。我们把Windows打好的jar包放到Linux上,然后在Linux上执行native-image -jar native_test.jar native_test就可以了。当然,环境还是需要再配一遍的。

贴一下官方的文档,不需要翻墙,但是英文的:

  • https://docs.oracle.com/en/graalvm/jdk/21/docs/solutions-overview/#oracle-graalvm
  • https://www.graalvm.org/latest/guides/?topic=all
  • https://graalvm.github.io/native-build-tools/latest/maven-plugin.html

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

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

相关文章

uni-app:解决异步请求返回值问题

可以使用 Promise 或者回调函数来处理异步请求的返回值。 方法一&#xff1a; Promise处理异步请求的返回值 使用 Promise 可以将异步请求的结果通过 resolve 和 reject 返回&#xff0c;然后通过 .then() 方法获取成功的结果&#xff0c;通过 .catch() 方法获取错误信息。 …

ETL工具Kettle

1 Kettle的基本概念 一个数据抽取过程&#xff0c;主要包括创建一个作业&#xff08;Job&#xff09;&#xff0c;每个作业由一个或多个作业项&#xff08;Job Entry&#xff09;和连接作业项的作业跳&#xff08;Job Hop&#xff09;组成。每个作业项可以是一个转换&#xff…

MySQL 5.7限制general_log日志大小

背景 需求&#xff1a; 在MySQL 5.7.41中开启general_log 并限制其大小&#xff0c;避免快速增长占用硬盘空间。 解决&#xff1a; 通过定时任务&#xff0c;执行简单的脚本&#xff0c;判断general_log 日志的大小&#xff0c;实现对通用查询日志的“每日备份”或“每日清…

保姆级教学安装Linux操作系统,以及Linux的语法入门

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Linux》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这个专…

服务运营 |论文解读: 住院病人“溢出”:一种近似动态规划方法

摘要 在住院床位管理中&#xff0c;医院通常会将住院病人分配到相对应的专科病房&#xff0c;但随着病人的入院和出院&#xff0c;可能会出现病人所需的专科病房满员&#xff0c;而其他病房却有空余床位的情况。于是就有了 "溢出 "策略&#xff0c;即当病人等候时间…

模型对象CSS2DObject始终在画布的左上角(问题解决)

写了个简单案例模拟一下这个问题&#xff0c;看下图片 下面看下c2渲染器相关代码部分 this.css2DRenderer new CSS2DRenderer(); this.css2DRenderer.render(this.scene, this.camera); this.css2DRenderer.setSize(width, height); this.css2DRenderer.domElement.style.pos…

【设计模式】第4节:创建型模式之“单例模式”

一、介绍 采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。 不使用单例模式的UML类图&#xff1a; 使用单例模式的UML类图&#xff1a; 使用场景&#xff1a; 需要频繁创建或销毁的对象…

​Profinet转EtherNET/IP从站连接欧姆龙plc与西门子200smart通讯的配置方法​

本案例是200smart plc与欧姆龙plc进行通讯的方法&#xff0c;远创智控YC-PNM-EIP网关可以读写全系列西门子 PLC 数据。一般不需要 PLC 里做特殊的设置。只需要把 PLC 的变量地址配置到网关中&#xff0c;网关就可以读取指定地址的数据或者写数据到指定的地址。 PLC 通过网线连接…

[C++]——带你学习类和对象

类和对象——上 目录&#xff1a;一、面向过程和面向对象二、类的概念三、类的访问限定符和封装3.1 访问限定符3.2 封装 四、类的作用域五、类的实例化六、类的对象大小的计算七、类成员函数this指针7.1 this指针的引用7.2 this 指针的特性 目录&#xff1a; 类和对象是很重要…

Redis(02)| 数据结构-SDS

一、键值对数据库是怎么实现的&#xff1f; 在开始讲数据结构之前&#xff0c;先给介绍下 Redis 是怎样实现键值对&#xff08;key-value&#xff09;数据库的。 Redis 的键值对中的 key 就是字符串对象&#xff0c;而 value 可以是字符串对象&#xff0c;也可以是集合数据类型…

8通道模数转换AD7091驱动代码SPI接口ADC,verilog

名称&#xff1a;8通道模数转换AD7091驱动代码 软件&#xff1a;QuartusII 语言&#xff1a;Verilog 代码功能&#xff1a; 使用verilog代码设计AD7091R-8驱动代码 控制接口为SPI接口&#xff0c;实现8通道模数转换&#xff0c;输出8通道数字信号。 FPGA代码Verilog/VHDL代码…

一文通透位置编码:从标准位置编码到旋转位置编码RoPE

前言 关于位置编码和RoPE 我之前在本博客中的另外两篇文章中有阐述过(一篇是关于LLaMA解读的&#xff0c;一篇是关于transformer从零实现的)&#xff0c;但自觉写的不是特别透彻好懂再后来在我参与主讲的类ChatGPT微调实战课中也有讲过&#xff0c;但有些学员依然反馈RoPE不是…