目录

前言
我们用IDEA创建SpringBoot项目时,pom.xml文件一般是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>demo</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
其中由为注意的是两个插件,一个是maven-compiler-plugin和spring-boot-maven-plugin,那么这两个插件的作用是什么呢?
一、maven-compiler-plugin
总结起来就是一句话:maven-compiler-plugin 负责编译 Java 源代码成 .class 文件。
maven的生命周期中,compile 阶段 就是由 maven-compiler-plugin 负责执行的。
哦,那我们明白了,但我还有一点疑问,我们都学过Java基础,编译Java源代码不是JDK做的吗?还使用了一个javac,难道是我记错了?
你并没有记错,真正把 .java 文件编译成 .class 文件的,永远是 JDK 里的 javac 命令。
但你不会想自己去调用 javac,
想象一下,你的项目有 200 个 Java 文件,分布在几十个包下,还要指定 classpath、依赖 jar、输出目录、编码、注解处理器……
如果不用 Maven,你要自己执行.... 那可太麻烦了。
Maven 虽然自己 不会编译 Java,但它可以调用maven-compiler-plugin插件找到JDK 的 javac 来完成编译。
| 功能 | javac 能做吗? | Maven 自动帮你做吗? |
|---|---|---|
| 查找所有源码 | ❌ 要自己写命令 | ✅ 自动扫描 src/main/java |
| 处理依赖的 classpath | ❌ 要手动拼路径 | ✅ 自动从 Maven 仓库下载并添加 |
| 区分主代码和测试代码 | ❌ 全靠你组织目录 | ✅ 自动识别 src/main/java、src/test/java |
| 编译输出路径 | ❌ 手动指定 -d | ✅ 默认输出到 target/classes |
| 编译参数 | ✅ | ✅ 可通过 <compilerArgs> 统一配置 |
| 版本管理 | ❌ | ✅ <release> / <source> / <target> |
二、spring-boot-maven-plugin
我们再来说说spring-boot-maven-plugin插件的作用。
总结一句话:它是 Spring Boot 提供的一个 打包和运行插件,用来把你的项目打包成一个 可直接运行的独立 Jar 包(“fat jar” 或 “über jar”)。
我们这里先做个比对,普通maven项目打包盒SpringBoot项目打包的区别。
2.1 普通Maven项目
一般的 Maven Java 项目打包时,只会:
-
编译你的代码;
-
打包成一个
jar; -
不会自动包含依赖 jar;
-
启动时需要你手动在 classpath 上加依赖;
2.2 Spring Boot Maven 插件的增强
Spring Boot 团队提供了 spring-boot-maven-plugin,
它在打包时会自动帮你做这些事 👇:
| 功能 | 说明 |
|---|---|
| ✅ 把所有依赖一起打进最终 jar(fat jar) | 包含 Spring Boot、第三方依赖、你自己的 class |
| ✅ 生成可直接运行的 jar | 可以直接 java -jar app.jar 启动 |
| ✅ 自动设置入口类 | 根据你的 @SpringBootApplication 自动找 main() |
✅ 支持 mvn spring-boot:run | 不用打包就能直接启动项目 |
| ✅ 支持 layered jar(分层打包) | 用于 Docker 镜像优化 |
| ✅ 支持排除不需要的依赖 | 例如 Lombok(仅编译期使用) |
那就明白了,二者最大的区别就是一个不会把依赖包打包进去,另一个会打包进去,所以二者的jar包大小也不一样。
5003

被折叠的 条评论
为什么被折叠?



