5

我正在尝试使用 maven 和 lombok 的 @Slf4j Logger 构建一个 Java 11 项目,但 maven 无法识别这些log变量。IntelliJ 确实并且能够构建该项目。

错误是

[ERROR]: cannot find symbol variable log 

项目和模块 SDK 都是 Java 11。Lombok 版本是 1.18.2:

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

我的 Maven 编译器设置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>11</source>
                <target>11</target>
                <forceJavacCompilerUse>true</forceJavacCompilerUse>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.12</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

我已经尝试过:

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

3 回答 3

4

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

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


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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>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>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
            <optional>true</optional>
        </dependency>

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

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

main.java

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Main {

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

如果遇到问题,请始终尝试强制在项目文件夹中运行 maven 依赖项更新mvn -U clean package并在 IDE 中重新导入 maven 项目

看截图

于 2020-04-28T12:23:51.480 回答
2

我怀疑这是一个误导性的错误消息,因为 Lombok 在编译期间挂钩。

在字节码中,没有导入的概念。类被它们的完全限定名替换(例如Integerto java.lang.Integer)。因此,在编译的某个时刻,导入被解析、应用,并且任何未知的类(例如,由于缺乏正确的依赖关系)都会在这个阶段抛出错误。

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

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

因为 Lombok 在编译过程中进行了更改,所以我想这些虚假错误总是有可能的。也许 Lombok 开发人员可以通过自己检查org.slf4j.Logger. Lombok 提供的大部分功能不涉及“导入”外部类,所以我并不惊讶它没有尽可能优雅地处理这种边缘情况。

如果添加 SLF4J 的依赖项,编译器将不再报错。

于 2020-04-28T14:56:45.373 回答
0

在 lombok.log.custom.declaration 属性的 lombok.config 文件中,使用全名,包括类的包

lombok.log.custom.declaration=com.mycomp.logging.Log
com.mycomp.logging.LogFactory.getLog(TYPE)(TOPIC)
于 2021-11-22T23:57:30.507 回答