在SpringBoot项目中如何确保FFmpeg和OpenCV的so依赖在打包后正确加载?

在springboot项目中如何确保ffmpeg和opencv的so依赖在打包后正确加载?

在SpringBoot项目中如何确保FFmpeg和OpenCV的so依赖在打包后正确加载?

在开发过程中,经常会遇到将FFmpeg和OpenCV集成到SpringBoot项目中的情况,尤其是当项目需要处理视频和图像时。然而,开发环境和生产环境之间的差异常常导致库文件加载问题。本文将详细探讨如何在SpringBoot项目中正确加载FFmpeg和OpenCV的so依赖,并确保打包后的应用也能正常运行。

问题背景

在使用Java 21和SpringBoot 3开发的项目中,我们依赖于FFmpeg 7.1-1.5.11和OpenCV 4.10.0-1.5.11这两个库。项目的pom.xml配置如下:

  1.5.11  4.10.0-1.5.11  7.1-1.5.11  linux-x86_64  windows-x86_64  ${javacpp.platform.linux-x86_64}      org.bytedeco    javacpp    ${bytedeco.version}        org.bytedeco    javacv    ${bytedeco.version}        org.bytedeco    opencv    ${opencv-platform.version}    ${javacpp.platform}        org.bytedeco    ffmpeg    ${ffmpeg-platform.version}    ${javacpp.platform}  

当项目打包成jar后,FFmpeg和OpenCV的so依赖应该被包含在jar包中的BOOT-INF/lib目录下。然而,在运行时,这些依赖并没有被正确加载,导致如下错误:

Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.UnsatisfiedLinkError: no jniavutil in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib [in thread "http-nio-8100-exec-1"]

在开发环境中,IDE会自动将依赖添加到classpath中,因此可以正常加载。但在生产环境中,jar包的运行方式不同,导致这些依赖无法被找到。

解决方案

为了解决这个问题,我们需要在SpringBoot应用中编程方式配置JavaCPP,以便在应用启动时正确加载这些本地库。

在应用启动时配置JavaCPP

我们可以创建一个配置类,在应用启动时执行必要的配置:

package com.demo.config;import org.bytedeco.javacpp.Loader;import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;@Configurationpublic class JavaCppConfig {    @PostConstruct    public void init() {        // 设置JavaCPP提取本地库的目录        System.setProperty("org.bytedeco.javacpp.extract", "true");        System.setProperty("org.bytedeco.javacpp.extractDir", "/tmp/javacpp-native-libs");                // 预加载需要的库,这会触发JavaCPP从jar中提取库文件        try {            // 预加载FFmpeg相关库            Loader.load(org.bytedeco.ffmpeg.global.avutil.class);            Loader.load(org.bytedeco.ffmpeg.global.avcodec.class);            Loader.load(org.bytedeco.ffmpeg.global.avformat.class);            Loader.load(org.bytedeco.ffmpeg.global.swscale.class);                        // 预加载OpenCV库            Loader.load(org.bytedeco.opencv.global.opencv_core.class);            Loader.load(org.bytedeco.opencv.global.opencv_imgproc.class);                        System.out.println("Native libraries loaded successfully");        } catch (Exception e) {            System.err.println("Failed to load native libraries: "   e.getMessage());            e.printStackTrace();        }    }}

自定义Docker镜像构建

如果项目需要构建成Docker镜像,我们可以创建一个自定义的Dockerfile来预先提取这些本地库并配置好路径:

FROM openjdk:21-slim# 安装程序运行所需的库RUN apt-get update && apt-get install -y     libgomp1     && rm -rf /var/lib/apt/lists/*# 创建目录用于提取本地库RUN mkdir -p /opt/javacpp-native-libsENV JAVACPP_EXTRACT_DIR=/opt/javacpp-native-libs# 设置工作目录WORKDIR /app# 复制应用jar包COPY target/*.jar app.jar# 预先提取所有本地库到指定目录RUN mkdir -p /tmp/extract &&     cd /tmp/extract &&     java -Dorg.bytedeco.javacpp.extract=true          -Dorg.bytedeco.javacpp.extractDir=/opt/javacpp-native-libs          -jar /app/app.jar --extract-native-libraries &&     rm -rf /tmp/extract# 设置系统属性,指向提取的本地库位置ENV JAVA_OPTS="-Dorg.bytedeco.javacpp.extractDir=/opt/javacpp-native-libs -Dorg.bytedeco.javacpp.extract=false"# 启动应用ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

通过上述方法,我们可以在应用启动时正确加载FFmpeg和OpenCV的so依赖,并且确保在Docker容器中也能正常运行,而无需修改基础镜像或将so文件添加到外部目录。

注意事项

JavaCPP需要能够写入临时目录来提取本地库。在Docker环境中,可能需要添加-Dorg.bytedeco.javacpp.maxphysicalbytes=0来防止内存限制问题。如果项目需要在多个平台(如Windows和Linux)上运行,需注意配置正确的平台属性。

通过在启动应用时添加以下系统属性,也可以尝试解决问题:

java -Djava.library.path=path/to/extracted/libs -Djavacpp.platform=linux-x86_64 -jar your-app.jar

以上就是在SpringBoot项目中如何确保FFmpeg和OpenCV的so依赖在打包后正确加载?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1504382.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JavaScript中的Promise如何使用?
上一篇 2025年12月20日 02:48:33
WGCLOUD agent主机是否需要安装JDK环境?
下一篇 2025年12月20日 02:48:48

相关推荐

  • mysql中and必须大写吗 mysql关键字大小写规则

    在mysql中,关键字不需要大写,因为mysql对关键字大小写不敏感。1)你可以使用and、and、and等形式,mysql都能正确识别和执行。2)但在实际开发中,统一的编码风格很重要,很多团队选择使用大写关键字以区分关键字和标识符,提高代码可读性。3)mysql对标识符的处理可以通过lower_c…

    2026年10月3日
    1200
  • Docker Toolbox安装指南

    Docker Toolbox安装指南Docker Toolbox安装指南Docker Toolbox安装指南Docker Toolbox安装指南

    本文将全面讲解在windows 10操作系统中如何下载并配置docker toolbox的详细流程,帮助用户顺利完成环境搭建,提升开发与学习效率,尤其适合刚接触docker的新手参考。 1、 如果使用的是Windows 10之前的系统版本,推荐安装Docker Toolbox;而对于Windows …

    2026年10月3日 • 用户投稿
    700
  • 为什么硬盘文件无法打开?数据恢复的应急措施是什么?

    为什么硬盘文件无法打开?数据恢复的应急措施是什么?为什么硬盘文件无法打开?数据恢复的应急措施是什么?为什么硬盘文件无法打开?数据恢复的应急措施是什么?为什么硬盘文件无法打开?数据恢复的应急措施是什么?

    硬盘文件无法打开时,应立即停止使用并断电,判断是否为文件系统错误或硬件损坏,优先尝试外部连接、磁盘管理检查及数据恢复软件扫描,避免写入新数据,重要数据建议直接寻求专业帮助。 当你的硬盘文件突然无法打开,这通常预示着一个潜在的问题,它可能只是一个简单的软件小故障,也可能是更严重的硬件损坏。面对这种情况…

    2026年10月3日 • 用户投稿
    800
  • 创建空的JsonNode的正确姿势

    创建空的JsonNode的正确姿势创建空的JsonNode的正确姿势创建空的JsonNode的正确姿势创建空的JsonNode的正确姿势

    本文介绍了使用Jackson库创建空的JsonNode对象的几种方法,并提供了示例代码。通过ObjectMapper或JsonNodeFactory可以轻松创建空的JSON对象节点,并可将其用于替换现有节点的值,或者作为新节点添加到JSON树中。掌握这些方法,能有效提升JSON数据处理的灵活性和效率…

    2026年10月3日 • 用户投稿
    1200
  • 2025 年 Python 现状:83% 仍在运行旧版,Python Web 开发复兴

    2025 年 Python 现状:83% 仍在运行旧版,Python Web 开发复兴2025 年 Python 现状:83% 仍在运行旧版,Python Web 开发复兴2025 年 Python 现状:83% 仍在运行旧版,Python Web 开发复兴2025 年 Python 现状:83% 仍在运行旧版,Python Web 开发复兴

    第八届年度 python 开发者调查现已正式发布,基于来自全球超过 30,000 名 python 开发者的反馈。本次调研由 python software foundation 联合 jetbrains 的 pycharm 团队共同完成。 2025 年 Python 现状(精简速览)半数 Pyth…

    2026年10月3日 • 用户投稿
    200
  • linux中的rws是什么意思

    linux中的rws是什么意思linux中的rws是什么意思linux中的rws是什么意思linux中的rws是什么意思

    Linux中的“rws”是一种文件权限模式,用于设置文件的权限,rws权限模式包含的权限有:1、r,允许读取文件内容;2、w,允许修改或删除文件内容;3、s,将文件的修改同步到存储介质上。 本教程操作系统:Linux5.18.14系统、Dell G3电脑。 在Linux中,rws 是一种文件权限模式…

    2026年10月3日 • 用户投稿
    200
  • Win Server 2003屏保等待设置

    Win Server 2003屏保等待设置Win Server 2003屏保等待设置Win Server 2003屏保等待设置Win Server 2003屏保等待设置

    在windows server 2003系统中配置屏幕保护程序的等待时间,可通过以下步骤完成:首先打开控制面板,进入显示属性设置界面,切换到屏幕保护程序选项卡,调整等待时长并确认保存,从而启用自动屏保功能。 1、 启动Windows Server 2003操作系统后,点击任务栏左下角的“开始”按钮。…

    2026年10月3日 • 用户投稿
    100
  • 火狐浏览器怎么恢复上次关闭的标签页_火狐浏览器撤销关闭标签页与恢复会话技巧

    火狐浏览器怎么恢复上次关闭的标签页_火狐浏览器撤销关闭标签页与恢复会话技巧火狐浏览器怎么恢复上次关闭的标签页_火狐浏览器撤销关闭标签页与恢复会话技巧火狐浏览器怎么恢复上次关闭的标签页_火狐浏览器撤销关闭标签页与恢复会话技巧火狐浏览器怎么恢复上次关闭的标签页_火狐浏览器撤销关闭标签页与恢复会话技巧

    火狐浏览器可通过多种方式恢复已关闭标签页或整个会话。1、点击工具栏的“撤销”图标可逐个恢复最近关闭的标签页;2、在标签页上右键选择“重新打开关闭的标签页”实现相同操作;3、使用Ctrl+Shift+T快捷键快速恢复多个标签页;4、通过菜单进入历史记录并选择“恢复上一次会话”以还原全部页面;5、若功能…

    2026年10月3日 • 用户投稿
    100
  • 详解win10出现800703f1错误代码提示的解决方法

    详解win10出现800703f1错误代码提示的解决方法详解win10出现800703f1错误代码提示的解决方法详解win10出现800703f1错误代码提示的解决方法详解win10出现800703f1错误代码提示的解决方法

    win10系统时目前用户安装使用率比较高的一款操作系统,而win10系统也在针对给用户更好的使用体验,不断的在优化系统,发布更新。而最近有用户在win10更新升级的时候,出现了800703f1错误代码的提示。到底这是怎么一回事呢?该如何解决这一问题?此文黑鲨小编就为大家带来win10出现800703…

    2026年10月3日 • 用户投稿
    100
  • 创建空 JsonNode 的实用指南

    创建空 JsonNode 的实用指南创建空 JsonNode 的实用指南创建空 JsonNode 的实用指南创建空 JsonNode 的实用指南

    本文介绍了使用 Jackson 库创建空 JsonNode 的两种常用方法,并展示了如何将 Java 对象转换为 JsonNode。通过学习本文,你将掌握在 JSON 处理中创建和操作空节点的技巧,从而更好地构建和修改 JSON 数据。 在 Java 中使用 Jackson 库处理 JSON 数据时…

    2026年10月3日 • 用户投稿
    100
  • 怎么让豆包AI帮我调试代码 用豆包AI快速定位代码问题的3个步骤

    怎么让豆包AI帮我调试代码 用豆包AI快速定位代码问题的3个步骤怎么让豆包AI帮我调试代码 用豆包AI快速定位代码问题的3个步骤怎么让豆包AI帮我调试代码 用豆包AI快速定位代码问题的3个步骤怎么让豆包AI帮我调试代码 用豆包AI快速定位代码问题的3个步骤

    当你在使用豆包ai解决代码问题时,关键在于提供清晰、具体的信息。1. 首先要完整贴入错误信息,包括错误类型和行号,便于ai定位问题源头;2. 然后附上相关代码片段,聚焦问题区域,避免发送整个项目;3. 最后说明你期望的行为与实际结果的差异,帮助ai理解上下文并找出逻辑漏洞。掌握这三点技巧,能让豆包a…

    2026年10月3日 • 用户投稿
    200
  • linux中静态路由UG是什么

    linux中静态路由UG是什么linux中静态路由UG是什么linux中静态路由UG是什么linux中静态路由UG是什么

    Linux中静态路由UG是静态路由表中一个常见的标识符,表示默认网关,是指当主机需要发送数据包到不在其直接连接的网络上时,将使用的下一跳路由器,默认网关通常位于主机所连接网络的边界处,负责将数据包转发到其他网络中。 本教程操作系统:Linux5.18.14系统、Dell G3电脑。 在Linux中,…

    2026年10月3日 • 用户投稿
    100
  • 如何在Linux服务器上建立安全可靠的Docker镜像仓库?

    如何在linux服务器上建立安全可靠的docker镜像仓库? 随着容器技术的快速发展,Docker已经成为了构建和管理容器化应用的常用工具。然而,在实际应用中,如何建立一个安全可靠的Docker镜像仓库却是一个重要的问题。本文将介绍如何在Linux服务器上建立一个安全可靠的Docker镜像仓库,并提…

    2026年10月3日
    200
  • Win7系统如何打开本地安全策略

    Win7系统如何打开本地安全策略Win7系统如何打开本地安全策略Win7系统如何打开本地安全策略Win7系统如何打开本地安全策略

    相信不少用户对本地安全策略的概念并不熟悉,更不了解它的具体打开方式,导致在需要用到该功能时无从下手。那么在windows 7系统中,该如何打开本地安全策略呢?接下来就为大家详细介绍win7系统进入本地安全策略的具体步骤。 Win7打开本地安全策略的详细步骤: 1、首先点击桌面左下角的“开始”按钮,然…

    2026年10月3日 • 用户投稿
    100
  • 创建空的 JsonNode 的方法

    创建空的 JsonNode 的方法创建空的 JsonNode 的方法创建空的 JsonNode 的方法创建空的 JsonNode 的方法

    本文介绍了在 Jackson 库中创建空的 JsonNode 的两种常用方法,并提供示例代码。通过 ObjectMapper 或 JsonNodeFactory,你可以轻松地创建空对象节点,并将其用于替换或设置 JSON 结构中的特定字段。掌握这些方法,能够更灵活地处理 JSON 数据。 在处理 J…

    2026年10月3日 • 用户投稿
    300
  • sublime怎么用谷歌打开

    sublime怎么用谷歌打开sublime怎么用谷歌打开sublime怎么用谷歌打开sublime怎么用谷歌打开

    在 Sublime Text 中使用 Google Chrome 打开文件,需要执行以下步骤:1. 安装 Sublime Chrome Extension 插件;2. 将插件配置为 “browse_using_default_browser” 设置为 “False…

    2026年10月3日 • 用户投稿
    100
  • 如何在Linux上安装和配置Docker?

    如何在linux上安装和配置docker? Docker是一种开源的容器化平台,可用于在不同的操作系统上创建、打包和分发应用程序。它提供了一种与虚拟机不同的轻量级虚拟化技术,能够更高效地利用系统资源。本文将介绍如何在Linux上安装和配置Docker。 安装Docker在Linux系统上安装Dock…

    2026年10月3日
    200
  • 电脑硬盘被格式化后如何恢复?尝试深度恢复工具还原文件结构

    电脑硬盘被格式化后如何恢复?尝试深度恢复工具还原文件结构电脑硬盘被格式化后如何恢复?尝试深度恢复工具还原文件结构电脑硬盘被格式化后如何恢复?尝试深度恢复工具还原文件结构电脑硬盘被格式化后如何恢复?尝试深度恢复工具还原文件结构

    硬盘格式化后文件消失可尝试恢复:立即停止使用硬盘防止覆盖,优先通过Windows“以前的版本”或“文件历史记录”功能找回文件;若无效,使用嗨格式、易我等专业软件进行深度扫描恢复;或用DiskGenius重建分区表并导出数据至安全位置。 如果您尝试访问某个硬盘分区,但发现所有文件都已消失且系统提示该分…

    2026年10月3日 • 用户投稿
    100
  • 7月及1-7月江浙沪地区车型销量榜:小米SU7双榜第二

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 小米su7 8月25日,有汽车媒体公布了%ignore_a_1%7月及1-7月江浙沪地区车型销量TOP20榜单。数据显示,小米SU7在该区域表现抢眼,分别以8010辆的单月销量和58138辆的累…

    2026年10月3日
    100
  • Win10 开启以管理员身份运行

    Win10 开启以管理员身份运行Win10 开启以管理员身份运行Win10 开启以管理员身份运行Win10 开启以管理员身份运行

    ✍ 前言: ✍01 鼠标右击并选择以管理员身份运行(A)✪ 以Chrome浏览器快捷方式为例: ✍02 使用 win + s 快捷键启动电脑搜索,输入所需程序。 ✪ cmd命令提示符示例: ✍03 快捷方式属性[兼容性设置]前两种方法每次启动程序时都需手动操作才能以管理员身份运行,无法一次设定。 右…

    2026年10月3日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信