java [错误]:使用maven和lombok构建时找不到符号变量日志

atmip9wb  于 2023-08-02  发布在  Java
关注(0)|答案(4)|浏览(298)

我试图用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>


我已经试过了:

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

jm2pwxwz1#

这是使用@Slf4jlombok日志注解的最小示例配置。
你需要一个日志facade和一个实现,在这个例子中,我将使用slf4j(作为facade)和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");
    }
}


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


的数据

mm5n2pyu

mm5n2pyu2#

我怀疑这是一个误导性的错误消息,因为Lombok在编译过程中挂接了一个点。
在字节码中,没有导入的概念。类被它们的完全限定名替换(例如Integerjava.lang.Integer)。因此,在编译中的某个时刻,导入被解析、应用,并且任何未知的类(例如由于缺乏正确的相关性)将在该阶段抛出错误。
由于@Slf4j意味着您不需要导入org.slf4j.Logger,因此对于此类,上面描述的步骤将被忽略。
在Lombok附加了log字段之后,编译器必须随后查看它的用法,查看它无法识别的类org.slf4j.Logger并抛出错误。在正常情况下,由于早期的编译阶段,唯一可能的原因是字段不存在,因此推断符号log必须丢失。它真正无法理解的是字段logtype
因为Lombok在编译过程中进行了更改,所以我猜像这样的虚假错误总是有可能的。也许Lombok开发人员可以通过自己检查org.slf4j.Logger来修复它。Lombok提供的大多数功能都不涉及“导入”外部类,因此我并不感到惊讶,它没有尽可能优雅地处理这种边缘情况。
如果添加SLF4J的依赖项,编译器将不再抱怨。

nzrxty8p

nzrxty8p3#

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

lombok.log.custom.declaration=com.mycomp.logging.Log
com.mycomp.logging.LogFactory.getLog(TYPE)(TOPIC)

字符串

wh6knrhe

wh6knrhe4#

如果您已经添加了lombok插件并启用了lombok注解,那么问题出在IDE缓存上。
Invalidate Caches
Invalidate and Restart

相关问题