我将 Lombok 与 JDK8 一起使用,一切正常。然而,当我尝试升级到JDK17时,编译失败并出现错误
error: cannot find symbol
[ERROR] symbol: class Builder
cannot find symbol
[ERROR] symbol: method getKey()
在我的父母 pom 中,我有
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
项目结构是:
MainProject
|
-subProject1 --> pom1.xml
-subProject2 --> pom2.xml
-subProject3 --> pom3.xml
|
- Main pom.xml
- lombok.config
主要的pom.xml有
<modules>
<module>subProject1</module>
<module>subProject2</module>
<module>subProject3</module>
</modules>
我在 Intellij 和 Mac 终端中遇到同样的问题,所以这个问题不是 Intellij 特有的。
尝试了互联网上的多种方法。在 lombok.config 中添加了 lombok.addLombokGenerateAnnotation = true。 在maven-compiler插件中尝试了
<annotationProcessorPaths>
。但没有任何效果。我完全被阻止了。请提出建议。
maven-compiler-plugin 中的配置应该如下所示。属性
lombok.version
(版本:
<properties>
<maven.compiler.release>20</maven.compiler.release>
<spring.boot.version>3.2.0-M2</spring.boot.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<lombok.version>1.18.28</lombok.version>
</properties>
<dependencyManagement>
<dependencies>
...
<dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependency>
</dependencies>
</dependencyManagement>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
将 lombok 项目定义为真正使用它的模块中的依赖项也很重要:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
各位, 从 Spring Boot 2.7 (JDK 8) 迁移到 Spring Boot 3.1.5 (JDK17; Maven 3.9.5) 后,我也遇到了这个问题:找不到符号
启动一个新项目表明设置正在按预期工作。所以它的项目相关。
验证:
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.db.orinoco.soa.sb</groupId>
<artifactId>javaelevenstarter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>javaelevenstarter</name>
<description>Demo project for Spring Boot 3 and JDK 17 (maven 3.9.5)</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
lombok.config
# Tell the @Slf4j annotation to generate the field 'LOG'.
lombok.log.fieldName = LOG
person.java
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
class Person {
private String name;
private String surname;
private String town;
}
JavaElevenStarterApplicationTests.java
@Slf4j
@SpringBootTest
class JavaElevenStarterApplicationTests {
@Test
void contextLoads_lombock_AllArgsConstructor_Getter() {
final Person person = new Person("Dave", "Developer", "Davetown");
final String name = person.getName();
final String surname = person.getSurname();
final String town = person.getTown();
LOG.info("Person data - Name: {}, surname: {}, town: {}", name, surname, town);
Assert.hasText(name, "Dave");
Assert.hasText(surname, "Developer");
Assert.hasText(town, "Davetown");
}
@Test
void contextLoads_Builder_pattern() {
final Person person = Person.builder()
.name("Dave")
.surname("Developer")
.town("Davetown")
.build();
final String name = person.getName();
final String surname = person.getSurname();
final String town = person.getTown();
LOG.info("Person data - Name: {}, surname: {}, town: {}", name, surname, town);
Assert.hasText(name, "Dave");
Assert.hasText(surname, "Developer");
Assert.hasText(town, "Davetown");
}
}
已通过测试:2
console:
...JavaElevenStarterApplicationTests: Person data - Name: Dave, surname: Developer, town: Davetown
...JavaElevenStarterApplicationTests: Person data - Name: Dave, surname: Developer, town: Davetown
这让我假设某些依赖性导致了问题,并且 lombok 首先失败。
检查您的项目依赖项并尝试编译您的项目。