[错误]:使用 maven 和 lombok 构建时找不到符号变量日志
[ERROR]: cannot find symbol variable log when building with maven and lombok
我正在尝试使用 maven 和 lombok 的 @Slf4j Logger 构建一个 Java 11 项目,但 maven 无法识别 log
变量。 IntelliJ 可以构建项目。
错误是
[ERROR]: cannot find symbol variable log
Project和Module SDK都是Java11.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 作为注释处理器
- 将 Lombok 路径添加到
maven-compiler-plugin
注释处理器列表
这是使用 @Slf4j
lombok 日志注释的一个真正最小的示例配置。
您需要一个日志外观和一个实现,在本例中我将使用 slf4j (as facade) and 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");
}
}
如果遇到问题,请始终尝试在项目文件夹 运行 中强制更新 Maven 依赖项 mvn -U clean package
并在 IDE
中重新导入 Maven 项目
我怀疑这是一个误导性的错误消息,因为 Lombok 在编译期间挂钩了这一点。
在字节码中,没有导入的概念。 类 替换为它们的完全限定名称(例如 Integer
到 java.lang.Integer
)。因此,在编译的某个时刻,导入被解析、应用,任何未知的 classes(例如,由于缺少正确的依赖项)都会在这个阶段抛出错误。
由于 @Slf4j
意味着您不需要导入 org.slf4j.Logger
,因此 class.
缺少上述步骤
在 Lombok 附加了 log
字段后,编译器必须随后查看它的用法,查看它无法识别的 class org.slf4j.Logger
并抛出错误。一般情况下,由于编译阶段较早,唯一可能的原因是该字段不存在,因此推断一定是缺少符号log
。真正看不懂的是字段log
.
的type
因为 Lombok 在编译过程中进行更改,所以我猜像这样的虚假错误总是有可能的。或许 Lombok 开发人员可以通过自己检查 org.slf4j.Logger
来修复它。 Lombok 提供的大部分功能不涉及 "importing" 外部 classes,所以我对它没有尽可能优雅地处理这种边缘情况并不感到惊讶。
如果你添加SLF4J的依赖,编译器将不再报错。
在 lombok.config 文件中 lombok.log.custom.declaration 属性 使用全名,包括 类
的包
lombok.log.custom.declaration=com.mycomp.logging.Log
com.mycomp.logging.LogFactory.getLog(TYPE)(TOPIC)
我正在尝试使用 maven 和 lombok 的 @Slf4j Logger 构建一个 Java 11 项目,但 maven 无法识别 log
变量。 IntelliJ 可以构建项目。
错误是
[ERROR]: cannot find symbol variable log
Project和Module SDK都是Java11.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 作为注释处理器
- 将 Lombok 路径添加到
maven-compiler-plugin
注释处理器列表
这是使用 @Slf4j
lombok 日志注释的一个真正最小的示例配置。
您需要一个日志外观和一个实现,在本例中我将使用 slf4j (as facade) and 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");
}
}
如果遇到问题,请始终尝试在项目文件夹 运行 中强制更新 Maven 依赖项 mvn -U clean package
并在 IDE
我怀疑这是一个误导性的错误消息,因为 Lombok 在编译期间挂钩了这一点。
在字节码中,没有导入的概念。 类 替换为它们的完全限定名称(例如 Integer
到 java.lang.Integer
)。因此,在编译的某个时刻,导入被解析、应用,任何未知的 classes(例如,由于缺少正确的依赖项)都会在这个阶段抛出错误。
由于 @Slf4j
意味着您不需要导入 org.slf4j.Logger
,因此 class.
在 Lombok 附加了 log
字段后,编译器必须随后查看它的用法,查看它无法识别的 class org.slf4j.Logger
并抛出错误。一般情况下,由于编译阶段较早,唯一可能的原因是该字段不存在,因此推断一定是缺少符号log
。真正看不懂的是字段log
.
因为 Lombok 在编译过程中进行更改,所以我猜像这样的虚假错误总是有可能的。或许 Lombok 开发人员可以通过自己检查 org.slf4j.Logger
来修复它。 Lombok 提供的大部分功能不涉及 "importing" 外部 classes,所以我对它没有尽可能优雅地处理这种边缘情况并不感到惊讶。
如果你添加SLF4J的依赖,编译器将不再报错。
在 lombok.config 文件中 lombok.log.custom.declaration 属性 使用全名,包括 类
的包lombok.log.custom.declaration=com.mycomp.logging.Log
com.mycomp.logging.LogFactory.getLog(TYPE)(TOPIC)