跳至主要內容

解决javacv在jdos环境中启动依赖GLIBC_2.14 问题,libgtk-x11库缺失问题

程序员李某某原创javaopencvjavacv大约 2 分钟

解决javacv在jdos环境中启动依赖GLIBC_2.14 问题,libgtk-x11库缺失问题

1,给项目增加 javacv

可以在本地将图片进行合并了。 但是因为本地库有glibc的库和 gui的库。可以正常运行。 但是服务器使用的是docker 库的版本比较低。 需要增加镜像才可以启动成功。

2,本地可以运行,服务器报错

org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1315)
	... 31 more
Caused by: java.lang.UnsatisfiedLinkError: /home/admin/.javacpp/cache/openblas-0.3.23-1.5.9-linux-x86_64.jar/org/bytedeco/openblas/linux-x86_64/libjniopenblas_nolapack.so: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home/admin/.javacpp/cache/openblas-0.3.23-1.5.9-linux-x86_64.jar/org/bytedeco/openblas/linux-x86_64/libjniopenblas_nolapack.so)
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
	at java.lang.Runtime.load0(Runtime.java:809)
	at java.lang.System.load(System.java:1086)
	at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1779)
	... 48 more

还需要解决lib包启动需要 libgtk-x11-2.0.so.0 问题:

Caused by: java.lang.UnsatisfiedLinkError: /home/admin/.javacpp/cache/opencv-4.7.0-1.5.9-linux-x86_64.jar/org/bytedeco/opencv/linux-x86_64/libjniopencv_highgui.so: libgtk-x11-2.0.so.0: 无法打开共享对象文件: 没有那个文件或目录
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
at java.lang.Runtime.load0(Runtime.java:809)
at java.lang.System.load(System.java:1086)
at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:1779)
... 62 more

3,原因和解决办法

是由于glibc版本过低,升级glibc即可。 由于CentOS系统RPM源目前glibc最高版本是2.12,所以只能采用源码升级。 同时还需要安装 gtk2 的库。也是因为opencv需要。

截屏2024-01-19 10.05.26.png
截屏2024-01-19 10.05.26.png

选择基础镜像: java-jd-centos7-jdk8.0.192-tom8.5.42-ngx197:latest

然后创建 BaseDockerfile

FROM base_image

# 基础镜像
# java-jd-centos7-jdk8.0.192-tom8.5.42-ngx197:latest
# 文件信息*   BaseDockerfile

# https://blog.csdn.net/nalw2012/article/details/77684894
# 安装 glibc

RUN wget http://storage.jd.local/public-docker-bin/docker/seleniumhq-chrome/glibc-2.18.tar.gz && tar zxf glibc-2.18.tar.gz \
    && cd glibc-2.18 && mkdir build && cd build/ \
    && ../configure --prefix=/usr && make -j4 && make install && cd ../../ && rm -rf glibc-2.18* && strings /lib64/libc.so.6 | grep GLIBC

# libjniopencv_highgui.so: libgtk-x11-2.0.so.0: 无法打开共享对象文件: 没有那个文件或目录
# 再安装gtk 库。
RUN  yum install -y gtk2-devel

然后构建成功之后使用这个新的镜像即可。 启动就不报错了。

4,总结

主要的问题解决了,剩下就是代码优化了。 opencv做图片处理优化还是非常强大的,同时使用java写代码更加顺手。 在服务器上也可以正常运行了。相关的资料特别多。

可以直接看官方网站的资料了: https://docs.opencv.org/4.7.0/

上次编辑于:
贡献者: ext.liyuanhao3,李元昊