You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot集成JavaCV生成视频截图导致Jar过大问题求助

JavaCV导致Spring Boot Jar体积超限(AWS Elastic Beanstalk部署问题)

我使用带有FFmpeg绑定的JavaCV库处理视频文件并截取指定帧画面,但添加该依赖后,项目Jar文件从约90MB暴涨至1GB以上。由于AWS Elastic Beanstalk允许的Jar最大大小为500MB,现在部署遇到了严重阻碍。

已尝试操作:

  • 移除了项目中所有非必要依赖以缩减Jar体积
  • 尝试寻找替代库但未找到合适方案

我的pom.xml依赖配置如下:

<dependencies>
    <!-- <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-core</artifactId>
        <version>1.27</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-parsers</artifactId>
        <version>1.27</version>
    </dependency> -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.oauth-client</groupId>
        <artifactId>google-oauth-client</artifactId>
        <version>1.32.1</version>
    </dependency>
    <dependency>
        <groupId>com.google.http-client</groupId>
        <artifactId>google-http-client</artifactId>
        <version>1.32.1</version>
    </dependency>
    <!-- Thanks for using https://jar-download.com -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacv-platform</artifactId>
        <version>1.5.9</version>
    </dependency> -->
    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>javacv</artifactId>
        <version>1.5.9</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-csv</artifactId>
        <version>1.10.0</version>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
    <!-- mysql driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-s3</artifactId>
        <version>1.12.550</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
    <!-- APACHE POI Dependency for excel -->
    <!-- <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.2</version>
    </dependency> -->
    <!--        <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.1.2</version>
    </dependency> -->
    <dependency>
        <groupId>com.github.ozlerhakan</groupId>
        <artifactId>poiji</artifactId>
        <version>3.0.3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-aws</artifactId>
        <version>2.2.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-aws-messaging</artifactId>
        <version>2.2.6.RELEASE</version>
    </dependency>
</dependencies>

解决方法

一、优化JavaCV依赖(最直接的体积缩减)

JavaCV默认会引入多平台的FFmpeg原生库,这是体积暴涨的核心原因。可以精准控制只引入部署环境对应的原生库:

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>1.5.9</version>
    <!-- 排除默认引入的全平台原生库 -->
    <exclusions>
        <exclusion>
            <groupId>org.bytedeco</groupId>
            <artifactId>*</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 仅添加Linux x86_64平台的FFmpeg原生库(Elastic Beanstalk默认环境) -->
<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>ffmpeg-linux-x86_64</artifactId>
    <version>6.0-1.5.9</version>
</dependency>

注意:原生库版本需与JavaCV版本对应,例如JavaCV 1.5.9对应FFmpeg原生库版本为6.0-1.5.9。

二、Spring Boot打包优化

1. 使用分层打包

分层打包可将依赖与应用代码分离,部署时复用依赖层缓存,同时减小上传体积。在pom.xml中配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <layers>
                    <enabled>true</enabled>
                </layers>
            </configuration>
        </plugin>
    </plugins>
</build>

执行mvn clean package即可生成分层Jar,Elastic Beanstalk支持该部署方式。

2. 清理不必要的依赖

  • 将spring-boot-devtools设置为test scope(生产环境无需):
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>test</scope>
</dependency>
  • 检查AWS相关依赖,若仅使用S3功能,可排除AWS SDK中不需要的模块(需测试避免依赖缺失)。

三、替代库方案

若优化后仍无法满足体积要求,可考虑以下轻量方案:

1. 直接调用FFmpeg命令行

无需引入Java库,通过ProcessBuilder调用系统FFmpeg命令截取帧,几乎不增加Jar体积:

// 示例:截取视频第10秒的帧保存为image.jpg
ProcessBuilder pb = new ProcessBuilder(
    "ffmpeg", "-ss", "00:00:10", "-i", "input.mp4", "-vframes", "1", "image.jpg"
);
pb.inheritIO();
Process process = pb.start();
int exitCode = process.waitFor();
if (exitCode == 0) {
    // 截取成功
}

需确保Elastic Beanstalk环境安装FFmpeg,可通过.ebextensions/install_ffmpeg.config自动安装:

packages:
  yum:
    ffmpeg: []

2. 轻量视频处理库

  • FFmpegJava:轻量FFmpeg命令行封装库,提供友好Java API,体积极小:
<dependency>
    <groupId>net.bramp.ffmpeg</groupId>
    <artifactId>ffmpeg</artifactId>
    <version>0.7.0</version>
</dependency>
  • Xuggler:专注媒体操作的轻量库,截取帧功能稳定,体积远小于JavaCV:
<dependency>
    <groupId>xuggle</groupId>
    <artifactId>xuggle-xuggler</artifactId>
    <version>5.4</version>
</dependency>

内容的提问来源于stack exchange,提问作者Haleema Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:47:33