构建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>
关键配置说明
Spring Boot插件:
<includes>设置为none,直接告诉插件不要把任何第三方依赖打包进最终的Jar里。- 保留
repackage目标,确保生成的Jar是可执行的,同时指定主类保证启动逻辑正确。
依赖插件:
- 用
copy-dependencies替代unpack-dependencies(如果不需要解压的话),直接复制依赖Jar到target/lib,这样目录结构更整洁,运行时也能正常加载。 - 如果你的项目必须解压依赖才能运行,保留
unpack-dependencies即可。
- 用
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
相关产品推荐
相关产品推荐

