野禅 2025-01-03 12:31 采纳率: 100%
浏览 112
已结题

IDEA中为什么需要输入 mvn clean install 命令 Lombok 才生效?

一、先说需求:
IDEA中Lombok不生效,需要在终端(Terminal)运行以下命令:mvn clean install 或 mvn test 以后,才正常,且每次新建项目都是如此。
哪怕我将.m2\repository和.m2\wrapper文件夹全部删空了,也是如此,还是需要运行mvn命令后才正常。
请哪位详细讲解一下为什么?有没有替代方案,省得每次新建项目都要运行mvn命令?通俗点最好。
具体问题简单项目展示如下:
二、版本:
1、64 位操作系统, 基于 x64 的处理器,Windows 11 家庭中文版。
2、IntelliJ IDEA 2024.3.1.1 (Ultimate Edition),几天前卸了老的,刚装的新的。
三、构建:
1、生成器选择 Spring Boot(不知道为什么时候变成了Spring Boot,以前是Spring Initializr)
2、类型选择 Maven
3、Java 选择 21
4、添加依赖 Lombok、Spring Web

img

img

四、文件结构:

img

五、文件内容:
只动了三个文件:修改application.properties 为 application.yml;新建PersonInfo、DispInfo。三个文件内容如下:
application.yml:

spring:
    application:
        name: d03

server:
    port: 8081
    servlet:
        session:
            timeout: 30
    tomcat:
        uri-encoding: UTF-8
name: LaoTou
age: 50
personinfo:
    name: Tudi
    age: 30

PersonInfo:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "personinfo")
public class PersonInfo {
    private String name;
    private int age;
}

DispInfo:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Component;
import org.springframework.test.context.junit4.SpringRunner;

@Component
@SpringBootTest
@RunWith(SpringRunner.class)
public class DispInfo {
    @Value("${name}")  // 获取配置文件中的 name
    private String name;
    @Value("${age}")  // 获取配置文件中的 age
    private int age;

    @Autowired  // 自动装配。在非测试类中,建议使用其他方法注入
    PersonInfo personInfo;

    @Test  // 该注解表示一个测试方法
    public void getNameAndAge() {
        System.out.println("姓名:"+name+"    年龄:"+age);
    }

    @Test
    public void getPersonInfo() {
        System.out.println("姓名:"+personInfo.getName()+"    年龄:"+personInfo.getAge());
    }
}

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.4.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>d03</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>d03</name>
    <description>d03</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>21</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>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</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>

六、遇到的问题:

img

七、用过的方法:
1、Lombok 插件已安装;2、java compiler - use compiler 已选 javac;3、enable annotation processiing 已勾选;4、Rebuild Project 动作做过;5、Invalidate Caches and Restart 动作做过;6、java compiler与project settings 里JAVA版本一致;7、移除测试类中@Component 注解;8、删除项目目录下的 .idea 文件夹和 target 文件夹。

问题依旧。

最后,需要在终端(Terminal)运行以下命令:mvn clean install 或 mvn test 以后,才正常,且每次新建项目都是如此。
哪怕我将.m2\repository和.m2\wrapper文件夹全部删空了,也是如此,还是需要运行mvn命令后才正常。

请哪位详细讲解一下为什么?有没有替代方案,省得每次新建项目都要运行mvn命令?通俗点最好。

  • 写回答

27条回答 默认 最新

  • 喵手 新星创作者: 后端开发技术领域 2025-01-04 23:14
    关注

    该回答引用ChatGPT辅助答疑,若有帮助,还请题主采纳。


    问题分析

    在 IntelliJ IDEA 中,每次新建项目后需要运行 mvn clean installmvn test 才能让 Lombok 生效,问题可能来源于以下几个原因:


    1. Lombok 的注解处理器未正确生效

    尽管你已经勾选了 Enable annotation processing,但 Lombok 需要注解处理器生成相关的 .class 文件(比如 @Data 会生成 getter、setter)。mvn clean install 会触发 maven-compiler-plugin 执行注解处理,但 IDEA 的编译器可能没有正确配置,导致初始状态下 Lombok 的注解处理器没有生效。


    2. Maven 项目配置中未完成依赖解析

    新建项目后,Maven 的依赖可能未完全下载(即 .m2/repository 中 Lombok 的 jar 包未就绪),IDEA 在编译时无法找到 Lombok 的注解处理器。执行 mvn clean install 会下载依赖并触发注解处理器,这也就解释了为什么运行后 Lombok 正常。


    3. IDEA 与 Maven 的编译行为差异

    • Maven 编译行为:Maven 执行 mvn clean install 时会触发 maven-compiler-plugin 配置的注解处理器(annotation processor paths)。
    • IDEA 编译行为:IDEA 的编译器可能没有正确地处理 maven-compiler-plugin 中的 annotationProcessorPaths,需要显式地进行手动设置。

    解决方案

    为了避免每次新建项目都需要运行 mvn clean install,可以通过以下几种方式解决问题:


    方法 1:确认并手动配置 Lombok 注解处理器

    1. 确保 Enable annotation processing 已勾选

      • 进入 Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors
      • 勾选 Enable annotation processing
      • Annotation Processor Settings 页面中,选择 All Modules,并确保 Processor path 包含 Lombok 的依赖路径(IDEA 应该自动检测,但如果不行,可以手动添加)。
    2. 检查 IDEA 的编译器配置

      • 进入 Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler
      • 确保 Target bytecode version 与项目的 java.version 一致。
      • IDEA 默认使用其内置的编译器,而非 Maven 编译器。若要强制 IDEA 使用 Maven 的编译器,请切换到方法 3。
    3. 手动触发重新生成

      • 右键项目目录,选择 Rebuild Project

    注意:这种方法只适用于 IDEA 内置的注解处理器路径正确加载。


    方法 2:在 pom.xml 中修改配置,强制 IDEA 使用注解处理器

    可以在 pom.xml 中明确声明注解处理器,并让 IDEA 自动加载它:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                    </annotationProcessorPaths>
                    <compilerArgs>
                        <arg>-Amapstruct.defaultComponentModel=spring</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    修改后,重新导入 Maven 项目:

    1. 在 IDEA 左侧的 Maven 工具栏中点击 刷新按钮
    2. IDEA 会根据 pom.xml 配置加载注解处理器,无需手动运行 mvn clean install

    方法 3:使用 Maven 编译代替 IDEA 编译器

    可以强制让 IDEA 使用 Maven 的编译器,这样 Lombok 的注解处理器会自动生效:

    1. 打开 Settings -> Build, Execution, Deployment -> Build Tools -> Maven
    2. 勾选 Runner 选项中的 Delegate IDE build/run actions to Maven

    效果

    • 以后项目的编译和运行都由 Maven 处理,Maven 会自动调用注解处理器,无需额外运行 mvn clean install

    方法 4:设置项目模板,自动生效

    如果是每次新建项目时 Lombok 都失效,可以通过配置 IDEA 的项目模板来避免重复操作:

    1. 打开 IDEA 的主界面,点击 File -> New Projects Setup -> Preferences for New Projects
    2. 在新项目的设置中:
      • 勾选 Enable annotation processing
      • 设置编译器版本和注解处理器路径。
      • 确保 Lombok 插件已安装。

    效果
    新建项目时会自动应用这些配置,无需每次手动设置。


    方法 5:将 Lombok 配置为 provided 依赖

    如果问题依然存在,可以尝试将 Lombok 的依赖声明为 provided,以确保在开发环境中注解处理器正常工作:

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>
    

    注意:Lombok 本身不需要打包到生产环境中,将其标记为 provided 可以避免一些冲突。


    方法 6:替代 Lombok 的注解处理器

    如果 Lombok 的注解处理器始终无法生效,可以考虑使用 Java 原生的注解(如 @Getter@Setter),或者直接写出对应的 getter/setter 方法,尽管这样会增加代码量,但可以避免 Lombok 的兼容性问题。


    根本原因分析与替代方案

    1. 为什么需要运行 mvn clean install

      • 在未运行 mvn clean install 前,IDEA 的编译器可能没有正确触发注解处理器生成 .class 文件。
      • mvn clean install 会触发 Maven 的编译生命周期,正确执行 Lombok 的注解处理逻辑。
    2. 替代方案:

      • 最直接的方法是使用 Maven 编译正确配置注解处理器
      • 配置模板以避免每次新建项目都需要手动操作。

    通过上述方法,应该可以解决 Lombok 每次新建项目后都需要运行 mvn clean install 的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(26条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月5日
  • 已采纳回答 1月5日
  • 创建了问题 1月3日