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

问题描述 投票:2回答:1

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

2: 我的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>

我已经尝试过:

  • 把Annotaion Processing关掉又打开。
  • 重新安装龙目岛插件
  • 清除.m2repository文件夹
  • 手动添加lombok.jar作为注解处理器。
  • 添加龙目岛路径到 maven-compiler-plugin 注释处理器列表
java maven lombok java-11 intellij-lombok-plugin
1个回答
2
投票

这是一个非常简陋的配置示例,用于使用 @Slf4j lombok日志注解。

你需要一个logging facade和一个实现,在本例中我将使用 slf4j (作为门面)和 回流 (作为实施)。


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项目。

See screenshot


1
投票

我怀疑这是一个误导性的错误信息,因为Lombok在编译过程中钩入了这一点。

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

由于在这个阶段,任何未知的类(例如由于缺乏正确的依赖关系)都会抛出错误。@Slf4j 意味着您不需要导入 org.slf4j.Logger对于这个类来说,上面描述的步骤是缺失的。

在龙目岛添加了 log 字段,编译器随后必须查看它的用法,参见类的 org.slf4j.Logger 它不能识别并抛出一个错误。在正常情况下,由于编译阶段较早,唯一可能的原因是该字段不存在,因此推断出符号 log 一定是缺失的。它真正没有理解的是。类型 外地 log.

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

如果你为SLF4J添加了依赖关系,编译器将不再抱怨。

© www.soinside.com 2019 - 2024. All rights reserved.