windows下体验quarkus原生GraalVM编译打包
基础
- 本机是
win10
- GraalVM for JDK 21 Community 21.0.2,用的社区版的最新版本,并配置其
bin
目录加入环境变量 - Maven 3.9.6,用的最新版本
IDEA
,本机版本2023.2.5
- Visual Studio 2022 17.9.2,用的社区版最新版本,
quarkus
官网提到过Visual Studio 2017 Visual C++ Build Tools,可能2017或更高版本的这个也可以,但是由于本机早就装过Visual Studio
,所以就没有测试官网提到的工具。
初始
- 自己从
idea
中通过quarkus
模板创建一个项目即可,勾选Add sample code
,组件只选择RESTEasy Reactive
即可,idea
的社区版可能没有,那就去官网Quarkus - Start coding with code.quarkus.io下载初始的配置。 idea
中设置好此项目的java
和maven
的版本,就用上面的版本。- 自己在
idea
中可以运行体验下其功能及速度等。
普通打包
- 在
idea
中界面运行打包或是mvn package
,此时和我们常用打包基本没有区别,但是:- 打包出来的
xxx-1.0-SNAPSHOT.jar
是没法直接用java -jar
运行的,会报xxx-1.0-SNAPSHOT.jar中没有主清单属性
的错误。 - 需切换到
target/quarkus-app
目录下找到quarkus-run.jar
,用这个包来运行才行。 - 仅仅是运行,如果你想只拷贝这个
quarkus-run.jar
包到其它地方去执行也行不行的,必须把上面整个目录都拷贝过去才行。
- 打包出来的
- 要想只拷贝一个jar包就行,则打包命令需要变成
mvn package -Dquarkus.package.type=uber-jar
才行,此时打包后直接在target
目录下找到xxx-1.0-SNAPSHOT-runner.jar
,只拷贝这一个包就可以运行了。
原生打包
-
GraalVM 21
已自带native-image
,不需要用gu install native-image
等命令这样安装了。 -
打包前需要配置
Visual Studio Installer
,点击修改
按钮,如果图省事,则可以直接选择使用C++的桌面开发
,里面就包含要安装的: -
但实际不需要安装这么多,在
单个组件
选项中找到MSVC v143 - VS 2022 C++ x64/x86 生成工具(最新)
和Windows 10 SDK (10.0.20348.0)
(我本机是win10,所以选这个,如果是win11的系统,那就选win11开头的),这两个都找最新的就行,如上图红框。 -
点击
语言包
选项,取消中文
,只选择英语
,否则后续打包会报native-image building on Windows currently only supports target architecture: AMD64
错误,参考:报错解决 -
原生打包命令
mvn package -Dnative
,此时运行的话应该还会报一个错误:Failed to find 'vcvarsall.bat'
,官网提到了一种解决方法,下述命令找到本机上vcvars64.bat
实际所在位置替换掉:cmd /c 'call "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars64.bat" && mvn package -Dnative'
但是感觉更好的方法是直接将这个
call
语句放到native-image.cmd
中(在GraalVM
安装目录的bin
目录下),打开此文件,在最上方@echo off
下添加此调用,参考:解决方法@echo off call "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars64.bat" > null
-
至此,再运行打包命令,费时会比较长,成功后会打包出
xxx-1.0-SNAPSHOT-runner.exe
的文件,直接双击就可以运行,而且启动速度起飞。
参考
- quarkus实战系列
- 官方文档:BUILDING A NATIVE EXECUTABLE
- (2023版本)GraalVM+native-image+Visual Studio 在Win10上全流程安装(避坑+实操)
后续
- 后续也用
springboot3
来做过一个定时发送串口数据读取电表读数的native小应用(顺便测试了下虚拟线程的使用),由于用的串口库JSerialComm
是用jni
实现的,就比较麻烦了,需要用agentlib启动监听,然后将用到的JSerialComm
类库的方法执行一遍,然后会自动生成jni映射相关的文件jni-config.json
,然后再拷贝到resources\META-INF\native-image
目录下再打包后才能正常使用。 springboot3
打包出来的exe
很大,比jar
大很多,虽然启动速度是快了,但是本身对于部署什么的太不友好了。- 用开发电脑
win10
开发出来的放到win7
上会报错,可能要更换Windows 10 SDK (10.0.20348.0)
到Windows 7.1 SDK
才行? - 总之有惊喜,但是任重道远!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2017-03-09 PHP下CodeIgniter框架连接读取MS Access数据库文件
2017-03-09 Linux下LANMP集成环境中编译增加pdo_odbc模块