[英]How to configure Lombok with maven-compiler-plugin?
我在項目的maven中有一個根模塊和子模塊。 我正在嘗試使用龍目島。 我已經添加了
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.12</version>
<scope>provided</scope>
</dependency>
根 pom.xml。 在子模塊中,我有一個帶有 Lombok 注釋的類。 當我嘗試構建項目時,我得到了很多
找不到標志
我試圖在哪里調用 getter 和 setter。
我嘗試在 root pom 和 sub pom 以及 delombok 中使用具有相同版本(1.16.12)的 lombok -maven-plugin並將我的注釋類移動到 src/main/lombok,我已經查看了幾乎所有問題所以,嘗試所有的變種,但沒有成功。
我正在使用 Maven 3、Java 8、maven-compiler-plugin 和 3.6.1 版本。
我應該如何配置項目才能使用 lombok? 或者也許我做錯了。
這不是對似乎已解決的問題的直接答案,但可以作為未來搜索者的參考:
如果您使用 Dagger(或其他東西)來處理您的注釋,例如
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>com.google.dagger</groupId>
<artifactId>dagger-compiler</artifactId>
<version>2.15</version>
</path>
</annotationProcessorPaths>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
....
</plugins>
</build>
您必須將 lombok 添加為路徑
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>com.google.dagger</groupId>
<artifactId>dagger-compiler</artifactId>
<version>2.15</version>
</path>
<!-- SOLUTION -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</path>
</annotationProcessorPaths>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
....
</plugins>
</build>
您仍然必須將 lombok 列為提供的依賴項。
如果有人使用 JDK 11
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<arg>-sourcepath</arg>
<arg>${project.basedir}/src/main/java${path.separator}${project.basedir}/target/generated-sources/annotations${path.separator}/</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
我正在使用 Java 8 和@Getter(onMethod = @__({@NoSerialization}))
和@Getter(onMethod = @__({@Translation(messageKey = "translation.key")}))
onX 注釋。 我duplicate element '<any?>' in annotation @<any?>.
在錯誤輸出中。 看起來來自 Lombok 的人長期以來對 Java 8 有這樣的問題,鏈接到 github 上的問題。 Lombok 不處理上面注解中帶有messageKey
等參數的注解。 它僅適用於沒有參數的注釋和只有value
參數的注釋(當你不寫參數的名稱時)。
我不確定 lombok 和 lombok-maven-plugin 之間有什么區別,但是我的項目配置了這個依賴項:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.16.12.0</version>
</dependency>
我還沒有嘗試過 root 和 submodule pom,因為我的項目都傾向於相互隔離。 不確定這是否會給您帶來問題。
如果您使用的是 Eclipse,您是否運行過 lombok.jar 文件並將其指向您的 eclipse.exe 文件? 它需要修改 .exe 以便 Eclipse 知道這些 getter 和 setter 即將到來,這樣 Eclipse 就不會在開發過程中抱怨。
編輯:我正在使用 maven-compiler-plugin:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
我遇到了同樣的問題,但沒有任何效果,即 maven 插件版本、annotationProcessorPaths、提供的范圍等。
最后,我將其范圍縮小為從同一項目中的一個類對@UtilityClass
方法進行靜態導入,即不從依賴項中引入。 這導致注釋處理失敗,即使對於不相關的類也是如此,並且看起來像 lombok 代碼沒有正確編譯。 擺脫靜態導入使一切正常。
Github 上有一個未解決的問題,盡管顯然很難解決。
這個堆棧溢出答案的解決方案對我有用。 我之前錯過了添加 javaAgentClass
如果 maven 構建在訪問項目 lombok 注釋方法時找不到符號,那么我們必須顯式將annotationProcessorPaths
配置到maven-compiler-plugin
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven.compiler.plugin.version}</version>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
上面的解決方案對我來說就像一個魅力!
在使用之前的答案進行了一些實驗之后,這是我對使用ListAppender
而不使用Rule
的簡單示例的總結:
package example;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.read.ListAppender;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.slf4j.LoggerFactory;
import static org.junit.jupiter.api.Assertions.assertEquals;
class AllMineTest {
AllMine allMine = new AllMine();
Logger logger = (Logger)
LoggerFactory.getLogger(AllMine.class.getName());
ListAppender<ILoggingEvent> appender = new ListAppender<>();
@BeforeEach
public void setUp() {
logger.addAppender(appender);
appender.start();
}
@AfterEach
private void teardown() {
appender.stop();
appender.list.clear();
logger.detachAppender(appender);
}
@Test
void shouldWriteLogs() {
// When:
allMine.writeLogs();
// Then:
List<String> logMessages = appender.list.stream()
.map(ILoggingEvent::getMessage)
.collect(Collectors.toList());
assertEquals("Dogs are great", logMessages.get(0));
assertEquals("I prefer cats", logMessages.get(1));
}
}
對於我的生產班:
package example;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class AllMine {
public void writeLogs() {
log.info("Dogs are great");
log.info("I prefer cats");
}
}
我不需要 POM 中provided
的范圍,但需要 YMMV:
<?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>example-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>11</java.version>
<lombok.version>1.18.12</lombok.version>
<maven-plugin.version>3.8.1</maven-plugin.version>
<slf4j.version>1.7.30</slf4j.version>
<junit.version>5.7.2</junit.version>
<logback.version>1.2.3</logback.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>
利用:
<scope>provided</scope>
在 pom.xml 中是這樣的:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
</dependencies>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.