Linux下编译Spring Boot+Vaadin报openssl-legacy-provider错误
问题根因
报错本质是Vaadin前端构建阶段调用Webpack时,会自动向Node运行参数注入--openssl-legacy-provider参数,同Node版本下Linux报错、Windows正常,通常由两类原因导致:
- Linux系统中安装的Node.js 16.15是发行版官方源经过安全裁剪/加固的版本,会直接拦截
NODE_OPTIONS中传递的该OpenSSL相关参数,直接抛出错误终止进程; - 你执行
unset NODE_OPTIONS仅对当前操作的终端会话生效,通过IDE、系统服务等方式启动Spring Boot时,进程没有继承这个修改后的环境变量,且Vaadin自身的构建逻辑还是会自动注入该不被支持的参数。
解决方法
按优先级从高到低依次尝试即可:
- 升级Vaadin到对应大版本的最新补丁版
如果你使用的是Vaadin 22.1.x、23.0.x~23.2.x版本,直接升级到同系列最新补丁包即可。官方已经修复了错误给Node 16版本注入--openssl-legacy-provider参数的逻辑——这个参数本身是为Node 17+兼容旧版OpenSSL算法设计的,Node 16环境下完全不需要。 - 显式关闭Vaadin的旧版OpenSSL兼容开关
在项目的application.properties配置文件中添加如下配置,强制禁止Vaadin自动注入该参数:
如果是通过Maven命令行执行构建,也可以直接在vaadin.legacy-provider-enabled=falsepom.xml的vaadin-maven-plugin插件配置项中添加该参数,避免命令行打包时报错。 - 替换系统源安装的Node为官方二进制版本
卸载当前通过apt、dnf等系统包管理器安装的Node.js,改用Node.js官方发布的Linux二进制压缩包安装。官方编译的版本没有做NODE_OPTIONS参数的强制拦截,和Windows环境下的Node行为完全一致,即使碰到无效参数也只会输出警告,不会直接终止构建。 - 临时降级Node版本到16.14.x
Node 16.14及更早的16系列版本没有加入NODE_OPTIONS参数的强校验逻辑,即使Vaadin注入了无效参数,也只会打印警告日志,不会阻断前端编译流程。
注意:如果是通过IDEA等IDE启动项目,修改完系统环境变量后一定要重启IDE,IDE会缓存启动时读取到的系统环境变量,仅在终端中修改变量对IDE启动的进程不生效。
内容的提问来源于stack exchange,提问作者Kira Sign
相关产品推荐
相关产品推荐

