【Java架构师】创建SpringBoot项目 maven-compiler-plugin 和 spring-boot-maven-plugin的作用是什么?

目录

前言

一、maven-compiler-plugin

二、spring-boot-maven-plugin

2.1 普通Maven项目

2.2 Spring Boot Maven 插件的增强



前言

我们用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/javasrc/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包大小也不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Calvad0s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值