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

构建Maven项目时避免将依赖库打包进Jar文件

解决Spring Boot Jar包过大,外部加载依赖的方案

我懂你的痛点——默认的Spring Boot插件会把所有依赖一股脑打包进Jar里,导致Jar体积臃肿得离谱。咱们只需要调整几个插件的配置,就能让你的Jar只包含项目自身代码,运行时从指定的lib目录加载依赖。

核心思路

Spring Boot的spring-boot-maven-plugin默认会构建"fat jar"(包含所有依赖),我们要修改它的配置,让它生成仅包含自身代码的可执行Jar,同时配合maven-dependency-plugin把依赖复制到外部lib目录,最后通过maven-jar-plugin的Manifest配置告诉JVM去哪里找依赖。

修改后的pom.xml build配置

<build>
    <plugins>
        <!-- Spring Boot插件:生成不含依赖的可执行Jar -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <!-- 排除所有第三方依赖,不打包进Jar -->
                <includes>
                    <include>
                        <groupId>none</groupId>
                        <artifactId>none</artifactId>
                    </include>
                </includes>
                <mainClass>com.kalsym.requestresponsesimulator.RequestResponseSimulatorApplication</mainClass>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <!-- 把依赖复制到target/lib目录 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <!-- 建议用copy-dependencies直接复制依赖Jar,比解压更整洁 -->
                        <goal>copy-dependencies</goal>
                        <!-- 如果你的场景需要解压依赖,保留unpack-dependencies即可 -->
                        <!-- <goal>unpack-dependencies</goal> -->
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- 配置Jar的Manifest,指定依赖路径 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <!-- 告诉JVM依赖在当前目录的lib文件夹下 -->
                        <classpathPrefix>lib/</classpathPrefix>
                        <mainClass>com.kalsym.requestresponsesimulator.RequestResponseSimulatorApplication</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

关键配置说明

  1. Spring Boot插件:

    • <includes>设置为none,直接告诉插件不要把任何第三方依赖打包进最终的Jar里。
    • 保留repackage目标,确保生成的Jar是可执行的,同时指定主类保证启动逻辑正确。
  2. 依赖插件:

    • 用copy-dependencies替代unpack-dependencies(如果不需要解压的话),直接复制依赖Jar到target/lib,这样目录结构更整洁,运行时也能正常加载。
    • 如果你的项目必须解压依赖才能运行,保留unpack-dependencies即可。
  3. Jar插件:

    • <addClasspath>true和<classpathPrefix>lib/会在Jar的Manifest文件中自动添加Class-Path属性,指向同级目录的lib文件夹,JVM启动时会自动从这个路径加载依赖。

构建与运行

  • 执行mvn clean package构建项目,完成后target目录下会得到体积很小的项目Jar,同时target/lib目录存放所有依赖文件。
  • 把Jar文件和lib目录放在同一级目录下,运行java -jar 你的项目名称.jar,程序就会自动从lib目录加载依赖启动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:07:53