如何使用 maven-compiler-plugin 配置 Lombok?
Posted
技术标签:
【中文标题】如何使用 maven-compiler-plugin 配置 Lombok?【英文标题】:How to configure Lombok with maven-compiler-plugin? 【发布时间】:2017-07-04 14:04:01 【问题描述】:我在项目的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 中使用具有相同版本 (1.16.12) 的 lombok-maven-plugin 以及 delombok 并将我的注释类移动到 src/main/ lombok,我几乎浏览了SO中的所有问题,尝试了所有变体,但没有成功。
我正在使用 Maven 3、Java 8、maven-compiler-plugin 和 3.6.1 版本。
我应该如何配置项目才能使用 lombok?或者我做错了什么。
【问题讨论】:
您是否将其添加为依赖项?您需要将其配置为要在编译插件之前执行的插件:awhitford.github.io/lombok.maven/lombok-maven-plugin/usage.html 你用的是什么IDE? 你是如何构建你的项目的?你在使用 IDE 吗?您是否尝试过直接使用 maven 构建它? @wemu 是的,我也尝试过使用插件:<plugin> <groupId>org.projectlombok</groupId> <artifactId>lombok-maven-plugin</artifactId> <version>1.16.12.0</version> <executions> <execution> <phase>generate-sources</phase> <goals> <goal>delombok</goal> </goals> </execution> </executions> </plugin>
我还把带注释的类放在 src/main/lombok 而不是 src/main/java
@MicheleDaRos IDE 无关紧要。我正在运行 Maven 命令
【参考方案1】:
这不是对似乎已解决的问题的直接答案,但可以作为未来搜索者的参考:
如果您使用 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 列为提供的依赖项。
【讨论】:
这是我的解决方案。我没有使用 dagger 而是使用 mapstruct-processor,并且在编译时我无法识别“set”和“get”。在插件中也添加lombok,它在构建和编译时间都标识了“set”和“get”。 也许将此答案移至***.com/questions/50361786/using-dagger2-with-lombok【参考方案2】:如果有人使用 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>
【讨论】:
【参考方案3】:我使用的是 Java 8 和 @Getter(onMethod = @__(@NoSerialization))
和 @Getter(onMethod = @__(@Translation(messageKey = "translation.key")))
onX 注释。我在错误输出中得到duplicate element '<any?>' in annotation @<any?>.
。看起来来自 Lombok 的人很长一段时间以来都对 Java 8 有这样的问题link to issue on github。 Lombok 不处理上面注解中带有 messageKey
等参数的注解。它仅适用于没有参数的注释和只有value
参数的注释(当你不写参数的名称时)。
【讨论】:
@AJT_82 这不是一个新问题,它是请求帮助的真实答案(如果将来有人会在 Lombok 支持此类注释时查看此问题)。所以你应该删除-1票。 我没有投反对票。但是您可能会因为您的答案中有问题(这是不允许的)而被否决了。现在您已经格式化了答案,现在它似乎是一个正确的答案:) 这是由于 javac 中的一个错误。我们找到了解决这个问题的方法。您可以通过以下方式跟踪我们的进度并关注讨论:github.com/rzwitserloot/lombok/issues/778【参考方案4】:我不确定 lombok 和 lombok-maven-plugin 之间有什么区别,但是我的项目配置了这个依赖项:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.16.12.0</version>
</dependency>
我还没有尝试过 root 和子模块 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-compile-plugin 吗? IDE 无所谓。 看起来 Lombok 无法使用 maven-compiler-plugin 和@Getter(onMethod = @__(@Translation(messageKey = "translation.key")))
之类的注释。我收到 cannot find symbol symbol: class __
编译错误。但它适用于@Getter(onMethod = @__(@NoSerialization))
-like 注释
@O.Zaiats 鉴于您关于 @Getter(onMethod = @__... 的帖子,我怀疑我的配置可能对您没有帮助,因为我没有使用该注释,并且错误报告您链接清楚地表明它是该注释语法和 Java 1.8 所特有的。对于它的价值,我使用的是 JDK 1.8.0_60 和 Maven 3.3.9(嵌入在 Eclipse Neon 中)。【参考方案5】:
我遇到了同样的问题,但没有任何效果,即 maven 插件版本、annotationProcessorPaths、提供的范围等。
最后,我将范围缩小到从同一项目中的一个类中对 @UtilityClass
方法进行静态导入,即不从依赖项中引入。这导致注释处理失败,即使对于不相关的类也是如此,并且看起来像 lombok 代码没有被正确编译。摆脱静态导入后一切正常。
在 Github 上有一个未解决的问题,尽管它显然很难解决。
【讨论】:
【参考方案6】:Maven Groovy and Java + Lombok
这个堆栈溢出答案的解决方案对我有用。我错过了之前添加的 javaAgentClass
【讨论】:
【参考方案7】:如果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>
以上解决方案对我来说就像一个魅力!
【讨论】:
【参考方案8】:在使用之前的答案进行了一些实验之后,这是我使用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>
【讨论】:
【参考方案9】:使用:
<scope>provided</scope>
在 pom.xml 中这样:
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
</dependencies>
【讨论】:
虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 @RafaelLemes 正如您在我的问题中看到的,我使用了以上是关于如何使用 maven-compiler-plugin 配置 Lombok?的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]