使用 Lombok 的 @Slf4j 和 Intellij 构建:找不到符号日志

Posted

技术标签:

【中文标题】使用 Lombok 的 @Slf4j 和 Intellij 构建:找不到符号日志【英文标题】:Building with Lombok's @Slf4j and Intellij: Cannot find symbol log 【发布时间】:2013-01-29 18:41:49 【问题描述】:

我有一个从命令行构建没有问题的 maven 项目。但是,当我使用 IntelliJ 构建它时,我得到了错误:

java: FileName.java:89: cannot find symbol
symbol  : variable log

java文件中没有定义或导入日志,但是有一个

@Slf4j
final public class FileName 

在定义日志类的类主体前声明。

在项目结构窗口中,类为:

Maven: org.slf4j:jcl-over-slf4j:1.6.1
Maven: org.slf4j:slf4j-api:1.6.6
Maven: org.slf4j:slf4j-log4j12:1.6.6
Maven: org.slf4j:slf4j-simple:1.6.6

列在库下,并表示已下载并可用。

知道为什么这会通过命令行使用 maven 构建,而不是通过 IntelliJ 构建,以及如何解决问题?

【问题讨论】:

遇到同样的问题,重新安装 Lombok 插件有帮助。 我修复了将 import groovy.util.logging.Slf4j; 替换为 import lombok.extern.slf4j.Slf4j; 【参考方案1】:

大概就是您正在使用的Lombok @Slf4j 注释。如果您希望 IntelliJ 识别 Lombok 注释,则需要在 IntelliJ 中安装 Lombok 插件。否则,如果您尝试使用不存在的字段,您会期待什么?

【讨论】:

我安装了 Lombok 插件。在配置选项方面似乎没有太多。也许这是插件中的一个错误? 我已经成功地将它与 IDEA 11 和 12 一起使用。有时,Lombok 似乎有些“忘记”了,我在源代码中得到了一堆红线,但它仍然为我构建.不过,它来来去去,所以插件绝对不是没有错误的。 你知道是否有解决方法可以解决这个问题吗?就像可能在不通过插件的情况下通知 IntelliJ Lombok 库一样?我正在尝试使用 IntelliJ 进行调试测试,这让我很难使用它 抱歉,帮不了你。我还没有用过Lombok。我只是在几个地方试了一下。我会查看插件的project page,但我觉得它周围还没有一个很大的社区。​​span> 【参考方案2】:

除了having Lombok plugin installed,还要确保勾选了“Enable annotation processing”复选框:

Preferences > Compiler > Annotation Processors

注意:从 IntelliJ 2017 开始,“Enable Annotation Processing”复选框已移至:

Settings > Build, Execution, Deployment > Compiler > Annotation Processors

【讨论】:

我没有启用注释处理并且可以工作:|我确实安装了 lombok 插件。 我安装了插件,它在不更改此设置的情况下工作。然而,我决定改变它。 使用 IntelliJ 2017.2 和 Lombok 插件 0.14.16,设置“启用注释处理”是必要的,该复选框位于 Preferences -> Build, Execution, Deployment -> Compiler -> Annotation Processors 下。跨度> IntelliJ 2018.2,lombok 插件安装 1.14。我仍然必须在 IntelliJ 中启用注释处理。文件->设置->构建、执行、部署->编译器->注释处理器。 IntelliJ 并没有真正赢得我的积分。 我的新项目还没有创建 slf4j-* 依赖项。一旦我添加它,Idea 就会识别日志及其方法。【参考方案3】:

在 IDEA 13 中,这似乎不再是问题,您只需安装 Lombok 插件即可。

【讨论】:

【参考方案4】:

我可能正在解决一个死话题,但一个简单的解决方案是检查你的依赖项(例如,Maven 的 pom)如果你包括 logback-corelogback-classic.

Slf4j 只是接口,你需要它背后的具体实现才能工作。

我已经被 IDEA 搞砸了两次,现在我可以走了:D

【讨论】:

【参考方案5】:

在 JDK8 下编译时,我在旧版本的 Lombok 上看到了这个问题。将项目设置回 JDK7 后问题就消失了。

【讨论】:

在 pom 中升级 lombok 依赖也可以:)【参考方案6】:

在 Intellij 版本 2016、2017 中,启用 Preferences -> Compiler -> Annotation Processors 对我不起作用!

以下附加复选框有帮助:

【讨论】:

我添加了插件并启用了注释处理器,但仍然没有运气。您能提供如何访问上述复选框吗? @PhilipJohn:在首选项搜索框中,输入“Lombok”? 其实我们还需要添加“org.slf4j”依赖【参考方案7】:

2019:

获取一个插件,你就被排序了......

文件 > 设置 > 插件

【讨论】:

名称:Lombok 插件【参考方案8】:

我刚刚安装了最新的idea版本2108.1,发现这个问题,安装lombok插件后重启idea解决了。

【讨论】:

【参考方案9】:

这对我有用: File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processor

勾选“启用注释处理”。 Apply

关闭

【讨论】:

【参考方案10】:

这不是 OP 的问题,但对于尝试一切但没有成功的其他人:

我有类似的症状。每当我在mvn clean 之后构建时,它就找不到loggetXYZ()builder() 或任何东西。

[ERROR]   symbol:   variable log
[ERROR]   location: class com.example.MyClass
[ERROR] /Path/To/Some/Java/src/main/com/example/MyClass.java:[30,38] cannot find symbol
[ERROR]   symbol:   method builder()
[ERROR]   location: class com.example.MyClass

在阅读了我能找到的关于 QueryDSL/JPA/Hibernate/Lombok/IntelliJ/Maven 问题的所有答案后,我发现罪魁祸首是单个 静态导入了带注释的 @Getter 方法在静态字段上

春季 1.15.14.RELEASE,Intellij 2019.1.1

@SpringBootApplication
public class BarApplication implements ApplicationContextAware 
  @Getter
  private static ApplicationContext applicationContext;

  // ... start Spring application, and grab hold of ApplicationContext as it comes past

import ...
import static BarApplication.getApplicationContext;

@Slf4j
public class IMakeItAllFail 
   public IMakeItAllFail() 
      log.info("", getApplicationContext());
   

@Slf4j
public class Foo 
  Foo() 
    log.info("I fail to compile but I have nothing to do with the other classes!");
  

【讨论】:

【参考方案11】:

启用注释处理器并安装 lombok 插件后,它仍然无法正常工作。我们通过检查想法选项“将 IDE 构建委托给 gradle”来解决它

【讨论】:

【参考方案12】:

为我工作!!!它在 CircleCI 和 Jenkins 上也失败了。

如果您是 Gradle 用户,请尝试将以下内容添加到您的依赖项中:

dependencies 
    //Other Dependencies >>

    //LOMBOK Dependencies
    annotationProcessor 'org.projectlombok:lombok'
    compileOnly 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
    testCompileOnly 'org.projectlombok:lombok'

【讨论】:

最后 3 项是我在使用 Gradle 时需要添加的。对于以前的项目,我已经处理了 Lombok 插件,以及我们使用 Maven 的以前项目的注释处理器复选框。使用 IntelliJ 创建 Spring Boot 项目并选择 Lombok 后遇到此错误;它包括 compileOnly 和 annotationProcessor 行,但不包括 test* 行。 这解决了我面临的问题,非常感谢!!【参考方案13】:

对我来说,解决问题的是在 Maven 设置中勾选“使用插件注册表”复选框。

路径为:文件->首选项->构建、执行、部署->构建工具->Maven

【讨论】:

【参考方案14】:

我尝试了几乎所有提到的答案,但没有一个对我有用。我的 gradle 构建每次都失败。刚刚找到这个解决方案:

添加annotationProcessor 'org.projectlombok:lombok' 在你的 build.gradle 中。

这对我有用。

【讨论】:

【参考方案15】:

从类中删除 @Slf4J 注释,然后重新添加它对我有用。

【讨论】:

【参考方案16】:

1 我的 gradle lombok 依赖项:

implementation 'org.projectlombok:lombok:1.18.10'
annotationProcessor 'org.projectlombok:lombok:1.18.10'

2 在IDEA(设置)中启用“注释...”后,考虑到您已经安装了Lombok插件,这解决了我同样的问题

【讨论】:

【参考方案17】:

这不是 IntelliJ 问题。如果您在控制台下尝试,运行 mvn install,也会中断。 lombok.extern 中的所有注释都需要添加依赖项。这个包对下一个注解进行了分组:

CommonsLog 鞭笞者 日志 JBossLog Lo​​g4 Lo​​g4j2 Slf4j XSlf4j

例如,对于 Slf4j,需要将此依赖项添加到您的 pom.xml

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

【讨论】:

OP 表示他在控制台下使用 mvn install 成功【参考方案18】:

如果您使用的是 maven,请尝试将 Lombok 路径添加到注释处理器的maven-compiler-plugin 列表中,如下所示。

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.3.0.Final</version>
                    </path>
                    <path>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                        <version>1.18.10</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>

根据您的 Lombok 版本更改版本。除此之外,请确保您已完成以下操作

为 Intellij 安装了 Lombok 插件。 为File -&gt; Settings -&gt; Build, Execution, Deployment -&gt; Compiler -&gt; Annotation Processor 下的项目启用注释处理。对我来说,Obtain processors from project classpathProcessor path 都在工作。因此,不确定哪种方法适合您,但请尝试哪种方法有效。

而不是在黑暗中拍摄几个小时。阅读一点注释处理器的工作原理以及编译器如何使用可能会有所帮助。所以请快速阅读下面的内容。

http://hannesdorfmann.com/annotation-processing/annotationprocessing101

【讨论】:

【参考方案19】:

删除每个模块中的.idea文件夹和.i​​ml文件并重建解决方案。

【讨论】:

【参考方案20】:

我有 Lombok 插件,启用了注释,它正在从命令行编译 - 一切,但它仍然没有将我的项目视为 maven(所有 maven 依赖项在源文件中都是红色的)。然后我单击 SHIFT 两次并搜索“maven”,结果中有“重新加载所有 Maven 项目”。运行后出现 Maven 选项卡,我可以编译,源代码中的所有红色下划线都消失了。

【讨论】:

【参考方案21】:

一件简单的事情,但我想通了:我错过了将@Log 添加到课程中。

@Log
public class YourClassName 



它可能对某人有所帮助。

【讨论】:

【参考方案22】:

我也有同样的问题;我使用 gradle 和 IDEA;

原来是gradle版本不对造成的。

在gradle\wrapper\gradle-wrapper.properties中是:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.8-bin.zip

但是,我在 IDEA 中指定的版本是

D:\Library\gradle-5.2.1

将gradle版本降低到4.10.x后,问题就解决了。

【讨论】:

【参考方案23】:

尝试在项目基目录下创建lombok.config文件并提供lombok.log.fieldName值。

例如:lombok.log.fieldName = LOG

【讨论】:

【参考方案24】:

这里有以下步骤:

步骤 1. 在文件 -> 设置 -> 构建、执行、部署 -> 编译器 -> 注释处理器下为您的项目启用注释处理

截图

第 2 步。 重启 IDE 后,在 IntelliJ IDE 中安装 lombok 插件。 截图

第 3 步。 在 build.gradle 文件中添加依赖项。

 compileOnly 'org.projectlombok:lombok:1.18.12'
 annotationProcessor 'org.projectlombok:lombok:1.18.12'

如果您在测试中使用 lombok,则需要添加:

testCompileOnly 'org.projectlombok:lombok:1.18.12'  
testAnnotationProcessor 'org.projectlombok:lombok:1.18.12'

或https://developervisits.wordpress.com/2020/09/16/building-with-lomboks-slf4j-and-intellij-cannot-find-symbol-log/

希望这个答案对你有帮助。

【讨论】:

自 2020.3 起,lombok 已包含在内,您不会在插件市场中找到它。见这里:github.com/mplushnikov/lombok-intellij-plugin【参考方案25】:

在如下警告之后,我遇到了同样的错误:

java: You aren't using a compiler supported by lombok, so lombok will not work and has been disabled.
  Your processor is: com.sun.proxy.$Proxy27
  Lombok supports: OpenJDK javac, ECJ

就我而言,它是an unfortunate combination of lombok < 1.18.16 and IDEA 2020.3。

【讨论】:

【参考方案26】:

因此,即使在启用注释处理并安装 Lombok 插件后问题仍然存在。

在 IDEA 2020.3 和 Lombok 中有一个 issue,您可以通过关注 this fix 来解决此问题。

基本上,将-Djps.track.ap.dependencies=false 添加到VM 选项中,您可以在:首选项-> 编译器中找到它。命名为“共享构建过程 VM 选项”

【讨论】:

【参考方案27】:

这是另一个相关的帖子Lombok not working with IntelliJ 2020.3 Community Edition,它可以解决用户使用lombookIntelliJ 2020.3 CommunityEdition 时的问题。

【讨论】:

【参考方案28】:

这就是为什么 IntelliJ 没有找到我的 maven 依赖项的问题:我在 pom 的其他地方有一个重复的标签“依赖项”。

【讨论】:

【参考方案29】:

使用这个依赖并尝试:

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

【讨论】:

【参考方案30】:

IDEA 2021 仍然存在问题,要解决它,请确保您的项目依赖项中有最新版本的 lombok。

【讨论】:

只有你的解决方案在想法上对我有用,但是,没有想法就没有任何问题。

以上是关于使用 Lombok 的 @Slf4j 和 Intellij 构建:找不到符号日志的主要内容,如果未能解决你的问题,请参考以下文章

@Slf4j lombok log对象

lombok插件/slf4j中字符串格式化

用lombok.extern的@Slf4j注解,使用log.info的时候,如何打印行号?

Lombok安装简单使用入门

注解@Slf4j的使用

使用@Slf4j log对象不可用,解决办法