NixOS下Quarkus编译失败 跳过测试无效及protoc报错求解
问题1:失败模块的属性
构建失败的quarkus-grpc-stubs(日志中显示为Quarkus - gRPC - Stubs for health and reflection)属于核心功能类库模块,不是测试模块。
- 该模块位于Quarkus源码的
extensions/grpc/stubs路径下,是Quarkus gRPC扩展的核心依赖组件,作用是预编译gRPC健康检查、服务反射能力对应的proto存根代码,后续的gRPC运行时模块、所有gRPC相关集成测试、上层集成能力都依赖这个模块的构建产出,这也是它失败后,后续gRPC Runtime、Micrometer、RESTEasy、集成测试、文档模块全部被跳过的原因。 - 你之前添加的
-Dmaven.test.skip=true参数只会跳过测试代码编译、测试执行的相关流程,不会作用于主代码构建阶段的protobuf代码生成逻辑,这也是你明明配置了跳过测试,该构建步骤依然会触发的核心原因。
问题2:NixOS环境下的构建报错修复方案
根因说明
你的判断完全准确,报错是NixOS的非标准FHS路径特性导致的:protobuf-maven-plugin会自动下载预编译的protoc-3.19.3-linux-x86_64.exe二进制文件,这个预编译文件是为标准Linux发行版构建的,写死了动态链接器(ELF解释器)路径为/lib64/ld-linux-x86-64.so.2,但NixOS的动态链接器不在这个默认路径下,内核加载二进制时找不到对应解释器,就会抛出No such file or directory错误——注意这个报错不是指protoc文件本身不存在,而是二进制依赖的动态加载器找不到。另外不要被.exe后缀误导,这是该插件的固定命名习惯,Linux/macOS平台下载的对应平台原生protoc二进制也会带这个后缀。
可选修复方案
- 方案1:使用Nix原生安装的protoc替换插件自动下载的二进制
先在构建环境中安装对应版本的protobuf,执行构建时通过参数指定Maven插件使用系统路径下的protoc,跳过自动下载逻辑:
如果构建过程中需要用到gRPC对应的protoc插件,也用同样方式安装grpc-java插件后,通过参数指定插件路径即可。# 先确保环境中存在protoc,比如通过nix-shell加载 nix-shell -p protobuf # 构建时指定系统protoc路径 mvn package -Dmaven.repo.local=$out -Dmaven.test.skip=true -Dprotobuf.protocPath=$(which protoc) - 方案2:修补已下载的protoc二进制
等插件将protoc下载到target/protoc-plugins/路径后,使用patchelf给二进制设置NixOS对应的正确动态链接器路径:
修补完成后,直接执行以下命令从失败模块恢复构建即可:patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" /build/source/extensions/grpc/stubs/target/protoc-plugins/protoc-3.19.3-linux-x86_64.exemvn <你的原有构建参数> -rf :quarkus-grpc-stubs - 方案3:使用标准FHS沙箱构建
通过Nix的buildFHSUserEnv能力构造一个符合标准Linux文件系统层级的构建沙箱,在沙箱内直接执行原有Maven构建命令,预编译的protoc可以正常找到动态链接器,不需要额外修改配置。
内容的提问来源于stack exchange,提问作者tobiasBora
相关产品推荐
相关产品推荐

