0

0

在Springboot项目中,如何正确加载FFmpeg和OpenCV的本地库(so文件)?

花韻仙語

花韻仙語

发布时间:2025-04-23 19:32:02

|

811人浏览过

|

来源于php中文网

原创

在springboot项目中,如何正确加载ffmpeg和opencv的本地库(so文件)是一个常见的挑战,尤其是在将项目打包成jar文件后运行时更为明显。以下详细探讨这个问题并提供解决方案。

Springboot项目中FFmpeg和OpenCV的so依赖加载问题

在使用Springboot进行项目开发时,如何正确加载FFmpeg和OpenCV的本地库(so文件)是一个常见的问题,特别是在打包成JAR文件后运行时尤为明显。下面详细探讨这个问题并提供解决方案。

问题背景

在开发过程中,我们使用了Java 21和Springboot 3,并通过Maven依赖引入了FFmpeg 7.1-1.5.11和OpenCV 4.10.0-1.5.11。配置文件pom.xml中详细列出了这些依赖:

<code><properties>
    <bytedeco.version>1.5.11</bytedeco.version>
    <opencv-platform.version>4.10.0-1.5.11</opencv-platform.version>
    <ffmpeg-platform.version>7.1-1.5.11</ffmpeg-platform.version>
    <javacpp.platform.linux-x86_64>linux-x86_64</javacpp.platform.linux-x86_64>
    <javacpp.platform.windows-x86_64>windows-x86_64</javacpp.platform.windows-x86_64>
    <javacpp.platform>${javacpp.platform.linux-x86_64}</javacpp.platform>
</properties>
<dependencies>
    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacpp</artifactId>
        <version>${bytedeco.version}</version>
    </dependency>
    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacv</artifactId>
        <version>${bytedeco.version}</version>
    </dependency>
    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>opencv</artifactId>
        <version>${opencv-platform.version}</version>
        <classifier>${javacpp.platform}</classifier>
    </dependency>
    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>ffmpeg</artifactId>
        <version>${ffmpeg-platform.version}</version>
        <classifier>${javacpp.platform}</classifier>
    </dependency>
</dependencies></code>

在IDE开发环境中,这些依赖库可以正常加载并使用。然而,当将项目打包成JAR文件后,运行时却无法找到这些本地库,导致出现类似下面的错误:

<code>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"]</code>

问题分析

当项目打包成JAR文件后,FFmpeg和OpenCV的本地库被嵌套在JAR包中的BOOT-INF/lib目录下,运行时这些库无法被JavaCPP的Loader类直接访问。开发环境之所以能够正常加载,是因为IDE将这些依赖添加到了classpath中。

解决方案

  1. 在应用启动时编程方式配置JavaCPP

    可以通过编写一个配置类,在应用启动时设置JavaCPP的相关属性,并预加载所需的库:

    <code>package com.demo.config;
    <p>import org.bytedeco.javacpp.Loader;
    import org.springframework.context.annotation.Configuration;
    import javax.annotation.PostConstruct;</p><p>@Configuration
    public class JavaCppConfig {</p><pre class="brush:php;toolbar:false;"><code>@PostConstruct
    public void init() {
        System.setProperty("org.bytedeco.javacpp.extract", "true");
        System.setProperty("org.bytedeco.javacpp.extractDir", "/tmp/javacpp-native-libs");
    
        try {
            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);
    
            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();
        }
    }</code>

    }

    Article Forge
    Article Forge

    行业文案AI写作软件,可自动为特定主题或行业生成内容

    下载
  2. 自定义Docker镜像构建

    为了在Docker环境中运行,可以创建一个自定义的Dockerfile来预先提取和配置本地库路径:

    <code>FROM openjdk:21-slim</p><p>RUN apt-get update && apt-get install -y \
    libgomp1 \
    && rm -rf /var/lib/apt/lists/*</p><p>RUN mkdir -p /opt/javacpp-native-libs
    ENV JAVACPP_EXTRACT_DIR=/opt/javacpp-native-libs</p><p>WORKDIR /app</p><p>COPY target/*.jar app.jar</p><p>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</p><p>ENV JAVA_OPTS="-Dorg.bytedeco.javacpp.extractDir=/opt/javacpp-native-libs -Dorg.bytedeco.javacpp.extract=false"</p><p>ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]</code>

通过上述方法,可以确保在Springboot项目中正确加载FFmpeg和OpenCV的本地库,无论是在开发环境还是打包成JAR文件运行,甚至是在Docker容器中。需要注意的是,在不同平台上可能需要调整javacpp.platform属性,并确保JavaCPP能够写入临时目录来提取本地库。

在Springboot项目中,如何正确加载FFmpeg和OpenCV的本地库(so文件)?

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1947

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2119

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1168

2024.11.28

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

280

2023.07.24

docker进入容器的方法有哪些
docker进入容器的方法有哪些

docker进入容器的方法:1. Docker exec;2. Docker attach;3. Docker run --interactive --tty;4. Docker ps -a;5. 使用 Docker Compose。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

516

2024.04.08

docker容器无法访问外部网络怎么办
docker容器无法访问外部网络怎么办

docker 容器无法访问外部网络的原因和解决方法:配置 nat 端口映射以将容器端口映射到主机端口。根据主机兼容性选择正确的网络驱动(如 host 或 overlay)。允许容器端口通过主机的防火墙。配置容器的正确 dns 服务器。选择正确的容器网络模式。排除主机网络问题,如防火墙或连接问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

416

2024.04.08

docker镜像有什么用
docker镜像有什么用

docker 镜像是预构建的软件组件,用途广泛,包括:应用程序部署:简化部署,提高移植性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

454

2024.04.08

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.5万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号