解决javacv在jdos环境中启动依赖GLIBC_2.14 问题,libgtk-x11库缺失问题
原创java图opencvjavacv大约 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需要。

选择基础镜像: 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/
