关于Java:[错误]:使用Maven和Lombok构建时找不到符号变量日志

[ERROR]: cannot find symbol variable log when building with maven and lombok

我正在尝试使用maven和lombok的@ Slf4j Logger构建Java 11项目,但是maven无法识别log变量。 IntelliJ可以并且可以构建项目。

错误是

1
[ERROR]: cannot find symbol variable log

项目和模块SDK均为Java11。Lombok版本为1.18.2:

1
2
3
4
5
6
<dependency>
    <groupId>org.projectlombok</groupId>
    lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

我的Maven编译器设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>11</source>
                <target>11</target>
                <forceJavacCompilerUse>true</forceJavacCompilerUse>
               
                    <path>
                        <groupId>org.projectlombok</groupId>
                        lombok</artifactId>
                        <version>1.18.12</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

我已经尝试过:

  • 关闭并再次打开注释处理
  • 重新安装Lombok插件
  • 清除.m2 / repository文件夹
  • 手动添加lombok.jar作为注释处理器
  • 将Lombok路径添加到注释处理器的maven-compiler-plugin列表


这是使用@Slf4j lombok日志注释的一个非常小的示例配置。

您需要一个日志外观和一个实现,在这种情况下,我将使用slf4j(作为外观)和logback(作为实现)。

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    untitled</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
    </dependencies>
</project>

main.java

1
2
3
4
5
6
7
8
9
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Main {

    public static void main(String[] args) {
        log.debug("Hello");
    }
}

如果遇到麻烦,请始终尝试强制在项目文件夹mvn -U clean package中运行的Maven依赖项更新,然后在IDE中重新导入Maven项目。

See screenshot


我的怀疑是由于Lombok在编译过程中出现问题,这是一个误导性的错误消息。

在字节码中,没有导入的概念。类将被其完全限定的名称替换(例如Integerjava.lang.Integer)。因此,在编译的某个时刻,将对导入进行解析,应用,并且任何未知类(例如,由于缺少正确的依赖关系)都会在此阶段引发错误。

由于@Slf4j意味着您不需要导入org.slf4j.Logger,因此此类缺少上述步骤。

在Lombok附加了log字段之后,编译器必须随后查看其用法,请参阅类org.slf4j.Logger,它无法识别并引发错误。在正常情况下,由于编译阶段较早,唯一可能的原因是该字段不存在,因此推断出符号log必须丢失。真正无法理解的是字段log的类型。

因为Lombok在编译过程中进行了更改,所以我猜像这样的虚假错误总是可能的。也许Lombok开发人员可以通过自己检查org.slf4j.Logger来修复它。 Lombok提供的大多数功能都没有涉及"导入"外部类,因此,它不能尽可能优雅地处理这种边缘情况也就不足为奇了。

如果为SLF4J添加依赖项,则编译器将不再抱怨。