我有一个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构建,以及如何解决问题?
答案 0 :(得分:113)
除了安装Lombok插件外,还要确保勾选“Enable annotation processing
”复选框:
Preferences > Compiler > Annotation Processors
注意:从IntelliJ 2017开始,“Enable Annotation Processing
”复选框已移至:
Settings > Build, Execution, Deployment > Compiler > Annotation Processors
答案 1 :(得分:20)
据推测,这是您正在使用的Lombok @Slf4j注释。如果您希望IntelliJ识别Lombok注释,则需要在IntelliJ中安装Lombok插件。否则,如果您尝试使用不存在的字段,您会期望什么?
答案 2 :(得分:19)
答案 3 :(得分:5)
此处需要执行以下步骤:
第1步。在文件->设置->构建,执行,部署->编译器->注释处理器
下为您的项目启用了注释处理第2步。在重启IDE之后,在IntelliJ IDE中安装lombok插件。 截图
第3步。在build.gradle文件中添加依赖项。
compileOnly 'org.projectlombok:lombok:1.18.12'
annotationProcessor 'org.projectlombok:lombok:1.18.12'
希望这个答案对您有帮助。
答案 4 :(得分:4)
在IDEA 13中,这似乎不再是一个问题,你只需要安装Lombok插件。
答案 5 :(得分:4)
如果你包括 logback-core 和 logback-classic
Slf4j 只是界面,你需要在它背后的具体实现才能工作。
我被搞了两次 IDEA 搞砸了,现在我很高兴:D
答案 6 :(得分:2)
在安装了lombok插件并重新启动Idea之后,我刚刚安装了最新的Idea版本2108.1,并发现了此问题。
答案 7 :(得分:2)
这对我有用:
File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processor
勾选“启用注释处理”。
Apply
关闭
答案 8 :(得分:2)
因此,即使启用了注释处理并安装了Lombok插件,问题仍然存在。
有一个issue和IDEA 2020.3和Lombok,您可以按照this fix进行修复。
基本上,将-Djps.track.ap.dependencies=false
添加到VM选项中,可以在以下选项中找到它:首选项->编译器。命名为“共享的构建过程VM选项”
答案 9 :(得分:1)
在JDK8下编译时,我在旧版本的Lombok中看到了这个问题。将项目设置回JDK7会使问题消失。
答案 10 :(得分:1)
如果您正在使用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版本更改版本。除此之外,请确保您已完成以下操作
File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processor
下为您的项目启用了注释处理。对我来说,Obtain processors from project classpath
和Processor path
都在工作。因此,不确定是否适合您,但尝试任何可行的方法。而不是在黑暗中拍摄数小时。稍微阅读注释处理器的工作方式以及编译器使用它们可能会有所帮助。因此,请在下面快速阅读。
http://hannesdorfmann.com/annotation-processing/annotationprocessing101
答案 11 :(得分:0)
一个简单的事情,但我发现是:我错过了在课程中添加@Log
。
@Log
public class YourClassName {
}
这可能会帮助某人。
答案 12 :(得分:0)
对我来说,如果您使用的是 Maven,它会起作用。 我在 spring boot 项目的 pom.xml 中添加了这个。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
然后在我重新启动 IntelliJ 后,您只需在键入 @Slf4j 时使用 control+space 即可自动导入库。
并且不要忘记在以下位置启用启用注释处理: 设置 > 构建、执行、部署 > 编译器 > 注释处理器
答案 13 :(得分:0)
我有同样的问题;我使用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之后,问题解决了。
答案 14 :(得分:0)
尝试在 项目基本目录 下创建lombok.config
文件,并提供lombok.log.fieldName
值。
示例:lombok.log.fieldName = LOG
答案 15 :(得分:0)
在发生如下警告之后,我也遇到了同样的错误:
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。
答案 16 :(得分:0)
这是另一个相关的帖子 Lombok not working with IntelliJ 2020.3 Community Edition,它可以解决用户使用 lombook
和 IntelliJ 2020.3 CommunityEdition
时的问题。
答案 17 :(得分:0)
这是我为什么 IntelliJ 没有找到我的 Maven 依赖项的问题:我在 pom 的其他地方有一个重复的标签“依赖项”。
答案 18 :(得分:0)
使用此依赖项并尝试:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
答案 19 :(得分:0)
我有Lombok插件,已启用注释,它是从命令行进行编译的-一切仍然没有将我的项目视为maven(所有maven依赖项在源文件中均为红色)。然后,我两次单击SHIFT并搜索“ maven”,结果中有“重新加载所有Maven项目”。运行它后,出现了Maven选项卡,我可以进行编译,并且源代码中所有红色下划线都消失了。
答案 20 :(得分:0)
删除每个模块中的.idea文件夹和.iml文件,然后重建解决方案。
答案 21 :(得分:0)
这不是IntelliJ问题。如果您尝试在控制台下运行,则运行 mvn install 也会中断。 lombok.extern 中的所有注释都需要添加依赖项。该软件包将以下注释分组:
例如,对于Slf4j,有必要将此依赖项添加到您的 pom.xml
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
答案 22 :(得分:0)
1我的gradle龙目岛遗物:
implementation 'org.projectlombok:lombok:1.18.10'
annotationProcessor 'org.projectlombok:lombok:1.18.10'
2在IDEA(设置)中启用“注释...”后,考虑到您已经安装了Lombok插件,这解决了我同样的问题
答案 23 :(得分:0)
从类中删除@ Slf4J批注,然后重新添加它对我有用。
答案 24 :(得分:0)
我尝试了几乎所有提到的答案,但对我没有任何帮助。我的gradle构建每次都失败。刚刚找到此解决方案:
添加annotationProcessor 'org.projectlombok:lombok'
在您的build.gradle中。
这对我有用。
答案 25 :(得分:0)
对我来说,解决的事情是在Maven设置中选中“使用插件注册表”复选框。
路径为:文件->首选项->构建,执行,部署->构建工具-> Maven
答案 26 :(得分:0)
为我工作!!!在CircleCI和Jenkins上也都失败了。
如果您是Gradle用户,请尝试将以下内容添加到您的依赖项中:
dependencies {
//Other Dependencies >>
//LOMBOK Dependencies
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
testCompile 'org.projectlombok:lombok'
testImplementation 'org.projectlombok:lombok'
}
答案 27 :(得分:0)
启用注释处理器并安装lombok插件后,它仍然无法正常工作。我们通过选中Idea选项“ Delegate IDE build to gradle”来解决该问题
答案 28 :(得分:0)
这不是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 / 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!");
}
}
答案 29 :(得分:0)