建筑与龙目岛的@Slf4j 和 Intellij: 无法找到符号日志

我有一个 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

列于图书馆之下,并显示已下载及可供使用。

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

223624 次浏览

可以推测,这就是您正在使用的 龙目岛@Slf4j注释。如果你想让 IntelliJ 识别龙目岛注释,你需要在 IntelliJ 中安装龙目岛插件。否则,如果尝试使用不存在的字段,您希望怎么做?

除了 安装龙目岛插件,还要确保“ Enable annotation processing”复选框在下面打勾:

Preferences > Compiler > Annotation Processors

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

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

在 IDEA 13中,这似乎不再是一个问题,你只需要安装龙目岛插件。

我可能是一个死的主题,但一个简单的解决方案是检查您的依赖(例如 Maven 的 pom) ,如果您包括 Logback-core后退,经典

Slf4j 只是一个接口,您需要它背后的具体实现来工作。

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

在使用 JDk8编译时,我在旧版本的龙目岛上看到了这个问题。将项目设置回 JDK7可以解决这个问题。

在 Intellij 2016,2017版本中,激活首选项-> 编译器-> 注释处理器对我不起作用!

以下附加复选框有所帮助:enter image description here

2019年:

得到一个插件,你是分类..。

文件 > 设置 > 插件

enter image description here

我刚刚安装了最新的点子版本2108.1,发现了这个问题,在安装了 lombok 插件并重新启动点子解决了它。

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

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

差不多

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

我也有类似的症状,无论我什么时候在 mvn clean之后建立,它都找不到 log,或者 getXYZ(),或者 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/龙目岛/IntelliJ/Maven 问题的答案之后,我发现罪魁祸首是一个单独的 在静态字段上注释的 @Getter方法的静态导入

发布,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!");
}
}

在启用注释处理器和安装 Lombok 插件之后,它仍然无法工作。我们通过检查创意选项“将 IDE build 委托给 gradle”来解决这个问题

对我很有效! ! ! 在 CircleCI & Jenkins 上也失败了。

如果你是一个 Gradle 用户,尝试在你的依赖关系中添加以下内容:

dependencies {
//Other Dependencies >>


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

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

路径是: File-> Preferences-> Build,Execution,Deployment-> Build Tools-> Maven

我几乎尝试了所有提到的答案,但没有一个对我有用。我的梯度构造每次都失败。我找到了解决办法:

加入 annotationProcessor 'org.projectlombok:lombok' 在你的楼里,梯度。

这招对我很管用。

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

1我的品级 Lombok 依赖:

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

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

这不是智力问题。如果尝试在控制台下运行 Mvn 安装,也会中断。来自 Lombok Exten的所有注释都需要添加依赖项。这个包对下一个注释进行分组:

  • CommonsLog
  • 鞭子
  • 木头
  • JBossLog
  • 日志4
  • Log4j2
  • Slf4j
  • XSlf4j

例如,对于 Slf4j,有必要将这个依赖项添加到 Pom.xml

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

如果你正在使用 maven,尝试将龙目岛路径添加到如下所示的 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>

根据您的龙目岛版本更改版本

  • 为 Intellij 安装了龙目岛插件。
  • File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processor下为项目启用注释处理。对我来说,Obtain processors from project classpathProcessor path都起作用了。所以不确定什么对你有效,但是尝试任何有效的方法。

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

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

删除每个模块中的.idea 文件夹和.iml 文件并重新构建解决方案。

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

一个简单的问题是: 我错过了向类中添加 @Log

@Log
public class YourClassName {




}

也许能帮到别人。

我有同样的问题,我使用分级和 IDEA;

事实证明,这是由错误的渐变引起的。

在 gradle 包装器 gradle-wrapper. properties 中,它是:

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

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

D:\Library\gradle-5.2.1

在把分级版本降低到4.10.x 之后,问题就解决了。

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

例子: lombok.log.fieldName = LOG

这里需要遵循以下步骤:

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

截图 enter image description here

步骤2. 在重新启动 IDE 之后,在 IntelliJ IDE 中安装 lombok 插件。 截图

enter image description here

步骤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/

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

我也犯了同样的错误,就在下面这样的警告之后:

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

对我来说,是 一个不幸的结合 lombok < 1.18.16和 IDEA 2020.3

因此,如果在启用注释处理和安装龙目岛插件之后问题仍然存在。

有一个带有 IDEA 2020.3和龙目岛的 问题,你可以通过跟随 解决这个问题来解决这个问题。

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

这是另一个相关的后 龙目岛不使用 IntelliJ 2020.3社区版,可以解决问题时,用户使用 lombookIntelliJ 2020.3 CommunityEdition

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

使用这个依赖项并尝试:

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

IDEA 2021仍然存在这个问题,为了解决这个问题,请确保在项目依赖关系中有最后一个 Lombok 版本。

对我来说,如果你使用 Maven,它就会起作用。 我在我的 Spring 启动项目的 pom.xml 中添加了这个。

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

然后,在我重新启动 IntelliJ 之后,在键入@Slf4j 以自动导入库时,只需控制 + 空格即可。

并且不要忘记在以下位置启用启用注释处理: 设置 > 构建、执行、部署 > 编译器 > 注释处理器

如果任何人仍然面临这个问题,这不是因为 IntelliJ,而是因为您需要为 maven 编译器插件指定注释处理器(如果您使用 maven,这是有原因的)

            <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>11</source>
<target>11</target>
      

<annotationProcessorPath>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</annotationProcessorPath>


</annotationProcessorPaths>
</configuration>
</plugin>
```

编译器 javac 使用的是14或17,而项目的目标版本是1.8

没有一个答案可以解决项目中可能存在不正确依赖关系的问题,如果使用的是 Spring boot,依赖关系的定义很简单:

    <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!--<version>1.18.12</version> you dont need to specify a version-->
<type>jar</type>
</dependency>

但是如果你不使用 Spring boot,你可以导入所有的依赖项:

        <!--region Lombok Configuration -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.8.0-beta2</version>
</dependency>


<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<type>jar</type>
</dependency>
<!-- endregion -->

这里假设 插件正常工作,"Enable Annotation Processing"复选框在以下位置激活:

设置 [ Ctrl + Alt + S ] > 构建,执行,部署 > 编译器 > < strong > 注释处理器

对于使用本机 lsp 客户端和使用 nvim-jdtls 插件的 jdtls 用户的 Neovim。

我也有这个问题,运行和编译是工作良好,但新的 lsp 诊断程序不断报告“未找到符号”。 我尝试了这里提到的所有解决方案,但对我的情况没有用处。

结果发现,我的问题是 Lombok 无法访问 Novim lsp,准确地说,是 Lombok 没有被注入为 JVM 参数。

问题是,在启动 jdtls 的自定义命令中,在 jdtls 之后是 Lombok。

java ... -jar /path/to/jdtls/jar -javaagent:/path/to/lombok.jar

这意味着将 Lombok 作为参数传递给 jdtls,而不是作为 JVM 争论。

为了解决这个问题,我必须将 Lombok 置于 jdtls 之前,以便它被接受为一个 JVM 争论。

java ... -javaagent:/path/to/lombok.jar -jar /path/to/jdtls.jar

就是这样。这是一个非常独特的情况下,但一定要确保你有 Jdtls 之前的 Lombok。