Oracle SQL Developer缺失libjvm.so问题及多JDK配置咨询
在Manjaro 22.0.1系统中,尝试用OpenJDK 17.0.6(2023-01-17)运行Oracle SQL Developer 22.2.1,同时测试了OpenJDK 11.0.18(2023-01-17),两个版本均通过pacman从Arch官方仓库安装(对应包为jre17-openjdk和jre11-openjdk),运行时均报错:
> oracle-sqldeveloper Error occurred during initialization of boot layer java.lang.UnsatisfiedLinkError: /usr/lib/jvm/java-17-openjdk/lib/libnio.so: /usr/lib/jvm/java-17-openjdk/lib/libnio.so: undefined symbol: reuseport_available
进一步检查libnio.so依赖,发现实际是找不到libjvm.so:
> ldd /usr/lib/jvm/java-17-openjdk/lib/libnio.so linux-vdso.so.1 (0x00007ffe0f1d7000) libjava.so => /usr/lib/jvm/java-17-openjdk/lib/libjava.so (0x00007f7354ce7000) libnet.so => /usr/lib/jvm/java-17-openjdk/lib/libnet.so (0x00007f7354ccf000) libc.so.6 => /usr/lib/libc.so.6 (0x00007f7354abb000) /usr/lib64/ld-linux-x86-64.so.2 (0x00007f7354d23000) libjvm.so => not found libjvm.so => not found
libjvm.so实际路径为/usr/lib/jvm/java-17-openjdk/lib/server/libjvm.so,设置LD_LIBRARY_PATH后问题解决。
- 这是否属于JDK安装问题?正常情况下是否应自动关联该文件?
- 日常需使用2-3个不同版本的JDK(OpenJDK及GraalVM 8、11、17),每个版本都有独立lib目录,如何最优设置各版本的
LD_LIBRARY_PATH? - 目前仅SQL Developer出现此问题,已在
~/.sqldeveloper/22.2.1/product.conf中指定了Java版本,是否可在此文件中配置库路径?尝试-Djava.library.path暂未生效。
问题1:是否属于JDK安装问题?
不属于标准的JDK安装问题。Arch系发行版的OpenJDK包默认不会将lib/server目录加入系统默认库搜索路径,因为JVM通常会自行处理该路径的加载,大部分Java应用也能正常识别。但SQL Developer启动时的类加载逻辑存在特殊处理,导致无法自动找到该路径下的libjvm.so,才触发了这个错误。
问题2:多JDK版本下的LD_LIBRARY_PATH最优设置
不要全局设置LD_LIBRARY_PATH,避免不同JDK版本的库冲突,推荐两种方式:
- 单应用临时设置:启动SQL Developer时,临时指定对应JDK的库路径,示例:
LD_LIBRARY_PATH=/usr/lib/jvm/java-17-openjdk/lib/server oracle-sqldeveloper - JDK切换工具+脚本封装:
- 用
archlinux-java或sdkman管理默认JDK版本,切换时自动适配库路径; - 为每个JDK版本创建专属启动脚本,比如针对SQL Developer的脚本:
给脚本添加执行权限后,通过脚本启动即可,不同JDK版本对应不同脚本。#!/bin/bash export JAVA_HOME=/usr/lib/jvm/java-17-openjdk export LD_LIBRARY_PATH=$JAVA_HOME/lib/server oracle-sqldeveloper
- 用
问题3:在product.conf中配置库路径
可以在product.conf中配置,但不能用-Djava.library.path(该参数针对Java层面的库加载,而此处是系统级动态库依赖问题),需直接设置环境变量:
打开~/.sqldeveloper/22.2.1/product.conf,添加以下内容:
SetJavaHome /usr/lib/jvm/java-17-openjdk SetEnv LD_LIBRARY_PATH /usr/lib/jvm/java-17-openjdk/lib/server
保存后重启SQL Developer即可生效。
内容的提问来源于stack exchange,提问作者Michael Lang

