在NixOS 23.05运行Clojure项目时遭遇共享库加载错误
在NixOS 23.05中解决Clojure项目依赖libgvc.so缺失的问题
你遇到的错误是因为clj-graphviz依赖Graphviz的libgvc.so库,而NixOS作为纯函数式发行版,默认不会将系统库暴露到常规路径,导致JVM无法找到该库。以下是几种解决方法:
临时运行方案(快速验证)
直接用nix-shell将Graphviz临时加入当前环境,再执行项目:
nix-shell -p graphviz --run "lein run"
该命令会创建包含Graphviz的临时环境,JVM就能找到所需的libgvc.so,执行后应能正常生成图片文件。
持久化环境配置
如果需要长期运行这类项目,可将Graphviz加入用户或系统环境:
方式1:使用Home Manager(推荐个人用户)
编辑~/.config/nixpkgs/home.nix,在environment.systemPackages中添加graphviz:
{ config, pkgs, ... }: { environment.systemPackages = with pkgs; [ graphviz leiningen # 如果还没安装lein ]; # 其他配置... }
保存后执行:
home-manager switch
之后直接在终端运行lein run即可。
方式2:修改系统配置(全局生效)
编辑/etc/nixos/configuration.nix,同样添加graphviz到系统包列表:
{ config, pkgs, ... }: { environment.systemPackages = with pkgs; [ graphviz leiningen ]; # 其他系统配置... }
执行以下命令应用配置:
sudo nixos-rebuild switch
项目级环境配置(用direnv)
如果只想在当前项目目录加载依赖,可配合direnv使用:
- 确保已安装direnv并启用(可通过
nix-shell -p direnv临时安装,或加入持久化环境) - 在项目根目录创建
.envrc文件:
use nix
- 同目录创建
shell.nix文件:
{ pkgs ? import <nixpkgs> {} }: pkgs.mkShell { buildInputs = [ pkgs.graphviz pkgs.leiningen ]; }
- 执行
direnv allow加载环境,之后进入项目目录即可直接运行lein run。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

