我正在運(yùn)行l(wèi)ombok的一些示例,并嘗試使用lombok.var。我正在使用jdk 17和帶有spring引導(dǎo)的lombok 1.18.2 4。我知道JEP286在Jdk 10中提供了var類型,但lombok文檔似乎認(rèn)為這應(yīng)該有效。一開始,我試圖通過IntelliJ構(gòu)建這個,而我的其他所有l(wèi)ombok教程都運(yùn)行良好,但當(dāng)我使用lombok.var時除外。因此,我切換到使用./gradlew clean build構(gòu)建表單終端,仍然得到相同的錯誤:
.../src/main/java/com/example/service/EmployeeImageService.java:6:error: illegal reference to restricted type 'var'
import lombok.var;
^
這是我的gradle文件:
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.1'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-rest'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok:1.18.24'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
我在項目的根目錄中包含了lombok.config。它具有以下設(shè)置:
lombok.nonNull.exceptionType=IllegalArgumentException
lombok.var.flagUsage=ALLOW
包含lombok導(dǎo)入的示例類:
package com.example.service;
import com.example.dao.Employee;
import com.example.repository.EmployeeRepository;
import lombok.RequiredArgsConstructor;
import lombok.var;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@RequiredArgsConstructor
@Service
public class EmployeeImageService {
private static final Logger LOGGER = LoggerFactory.getLogger(EmployeeImageService.class);
private final EmployeeRepository employeeRepository;
public byte[] findEmployeeImageById(final Long id){
LOGGER.info("EmployeeImageService.findEmployeeImageById() - retrieving employee image");
var message = "Hello";
message = message + " World!";
var employee = employeeRepository.findById(id);
return employee.map(Employee::getImage).orElse(null);
}
...
}
正如我所說,我知道Jdk 10中的JEP 286發(fā)布了var引用類型,但我不知道是什么導(dǎo)致了這個導(dǎo)入lombok.var引發(fā)編譯時錯誤:
.../src/main/java/com/example/service/EmployeeImageService.java:6:error: illegal reference to restricted type 'var'
import lombok.var;
^
因為,正如錯誤所說,java10稍微向后不兼容,因為現(xiàn)在根本不允許嘗試命名類型
var
,并且會彈出錯誤消息。OpenJDK團(tuán)隊公平地引入了這種不兼容,因為誰給他們的類型命名為var
?作為var-docs的狀態(tài),lombok引入了var,因為java 10引入了
var
作為關(guān)鍵字-它只為java 6/7/8/9開發(fā)人員使用,而無需更新JDK。在撰寫本文時(2023年初),lombok.var
的唯一用戶應(yīng)該是仍在java 8上的用戶。你可能真的應(yīng)該開始計劃很快離開,這是在“支持目前需要商業(yè)許可證,這是生活的舊階段”。除非有迫切需要,否則Lombok不會放棄對out-of-support java版本的支持(Lombok仍然支持{@117} 6!)。j6/7/8支持中包含了一些包袱,我們可能在某個時候真的想放棄,但在全球范圍內(nèi)的java 8使用量減少到一小部分之前,我們不會放棄。但是,如果我們放棄支持,lombok.val將被完全刪除。它不能在JDK10及以上版本中使用。
val
仍然是我們將繼續(xù)支持的功能,并且val
在JDK6-19中運(yùn)行良好。基本上只是final var
。與var
不同,val
不是上下文關(guān)鍵字。The solution
如果您有一個使用lombok的
var
的代碼庫,并將其升級到JDK版本10或更高版本,只需。。。刪除import語句,并保持var
的實際用法不變。除了在極少數(shù)情況下(主要是,加倍:var x = 5, y = "Hello";
是合法的lombok-var,而不是合法的java-var),您的代碼也會做同樣的事情。資料來源:我是lombok的主要維護(hù)者之一。