java.NativeLibLoader调用系统libgomp.so
问题
# java程序调用系统底层so库
You may need to install 'libgomp.so' (or glibc) via your package manager.
ERROR | | ml.dmlc.xgboost4j.java.NativeLibLoader | Failed to load xgboost4j due to missing native dependencies for platform linux/x86_64, this is likely due to a missing OpenMP dependency online_mode |
ERROR | | ml.dmlc.xgboost4j.java.NativeLibLoader | You may need to install 'libgomp.so' (or glibc) via your package manager
当前系统环境信息
正确命令:microdnf 或 yum
bash-4.4# cat /etc/os-release
NAME="Oracle Linux Server"
VERSION="8.8"
ID="ol"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="8.8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Oracle Linux Server 8.8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:oracle:linux:8:8:server"
HOME_URL="https://linux.oracle.com/"
BUG_REPORT_URL="https://github.com/oracle/oracle-linux"
ORACLE_BUGZILLA_PRODUCT="Oracle Linux 8"
ORACLE_BUGZILLA_PRODUCT_VERSION=8.8
ORACLE_SUPPORT_PRODUCT="Oracle Linux"
ORACLE_SUPPORT_PRODUCT_VERSION=8.8
bash-4.4# cat /etc/redhat-release
Red Hat Enterprise Linux release 8.8 (Ootpa)
解决
安装提示缺少的依赖so库libgomp,运行环境是基于容器化的
1.dnf安装提示command not found
在 Oracle Linux 8.8 里出现:
1 | sh: dnf: command not found |
你当前运行的不是完整的 Oracle Linux,而是“精简 / 容器基础镜像”
常见来源包括:
oraclelinux:8-slimoraclelinux:8-micro- 基于 OL8 的二次裁剪镜像
- distroless / runtime-only 镜像
这些镜像刻意移除了 dnf/yum,只保留运行时所需的最小集合。
2. 快速判断你现在是哪一类系统
看 /etc/os-release
1 | cat /etc/os-release |
如果你看到类似:
1 | NAME="Oracle Linux Server" |
但 没有 dnf,那几乎可以确定是:
Oracle Linux 8 的 minimal / slim / micro 容器
3. 解决路径
情况一:镜像里有 microdnf(最常见)
Oracle 官方为精简镜像准备了 microdnf
1 | microdnf --help |
如果存在,直接安装:
1 | microdnf install -y libgomp libstdc++ |
验证:
1 | ls /usr/lib64/libgomp.so* |
这是容器场景下的首选方案
情况二:只有 yum
极少数裁剪镜像保留了 yum:
1 | yum install -y libgomp libstdc++ |
ML / JNI 调用链
像 xgboost4j 这种链路:
flowchart LR
A[Java进程] --> B[JNI]
B --> C[libxgboost.so]
C --> D[libgomp.so]
只要少一个 so,服务就直接启动失败这类问题必须在镜像阶段解决。