配置 kapt 以处理 lombok 注释
Posted
技术标签:
【中文标题】配置 kapt 以处理 lombok 注释【英文标题】:Configuring kapt to process lombok annotations 【发布时间】:2017-10-26 02:09:30 【问题描述】:这是对这些问题的跟进:
Kotlin doesn't see Java Lombok accessors? Is kapt supported in maven?kapt 似乎从那时起已经发展,现在它甚至在 Maven 中得到支持。我正在尝试这个(注意配置中的 Lombok 注释处理器):
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>$kotlin.version</version>
<executions>
<execution>
<id>kapt</id>
<goals>
<goal>kapt</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>$project.basedir/src/main/java</sourceDir>
<sourceDir>$project.basedir/src/main/kotlin</sourceDir>
</sourceDirs>
<annotationProcessors>
<annotationProcessor>lombok.core.AnnotationProcessor</annotationProcessor>
</annotationProcessors>
</configuration>
</execution>
...
</plugin>
但它似乎仍然没有效果,Lombok @Getter
仍然被忽略,如相关问题中所述。
有什么可以做的吗?
【问题讨论】:
【参考方案1】:因此,如果您希望在 Kotlin 类上使用 Lombok 注释,这应该可以:
<execution>
<id>kapt</id>
<goals>
<goal>kapt</goal>
</goals>
<configuration>
<sourceDirs>
<sourceDir>src/main/kotlin</sourceDir>
<sourceDir>src/main/java</sourceDir>
</sourceDirs>
<annotationProcessors>
<annotationProcessor>lombok.launch.AnnotationProcessorHider$AnnotationProcessor</annotationProcessor>
</annotationProcessors>
<annotationProcessorPaths>
<annotationProcessorPath>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>$lombok.version</version>
</annotationProcessorPath>
</annotationProcessorPaths>
</configuration>
</execution>
如果需要在 Kotlin 代码中使用 Lombok 类,则需要使用 delombok:
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>$lombok.version.0</version>
<executions>
<execution>
<id>delombok</id>
<phase>generate-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
<configuration>
<formatPreferences>
<javaLangAsFQN>skip</javaLangAsFQN>
</formatPreferences>
<verbose>true</verbose>
</configuration>
</execution>
<execution>
<id>test-delombok</id>
<phase>generate-test-sources</phase>
<goals>
<goal>testDelombok</goal>
</goals>
<configuration>
<verbose>true</verbose>
</configuration>
</execution>
</executions>
</plugin>
在这种情况下,您根本不需要 kapt。对我来说就像一个魅力。
【讨论】:
不幸的是它没有帮助。mvn compile
和 IntelliJ Idea 也是如此。 ://
因此,如果您尝试在 kotlin 类上使用 lombok 注释 - 这个东西应该可以工作。如果您尝试将 lombok 类导入 kt - 您必须 delombok。我已经更新了这两种情况的答案。【参考方案2】:
经过大量谷歌搜索,我想出了这个解决方案,它允许同一模块中的 lombok 增强的 java 和 kotlin 代码相互调用:
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ericytsang</groupId>
<artifactId>playground</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>com.ericytsang playground</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<kotlin.version>1.2.50</kotlin.version>
<junit.version>4.12</junit.version>
<lombok.version>1.16.8</lombok.version>
</properties>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib</artifactId>
<version>$kotlin.version</version>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-test-junit</artifactId>
<version>$kotlin.version</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>$junit.version</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>$lombok.version</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>$lombok.version.0</version>
<executions>
<execution>
<id>delombok</id>
<phase>generate-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
<configuration>
<sourceDirectory>src/main/java</sourceDirectory>
<outputDirectory>$project.build.directory/delombok-main</outputDirectory>
<addOutputDirectory>false</addOutputDirectory>
</configuration>
</execution>
<execution>
<id>delombok-test</id>
<phase>generate-test-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
<configuration>
<sourceDirectory>src/test/java</sourceDirectory>
<outputDirectory>$project.build.directory/delombok-test</outputDirectory>
<addOutputDirectory>false</addOutputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>$kotlin.version</version>
<executions>
<execution>
<id>compile</id>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<sourceDirs>$project.build.directory/delombok-main</sourceDirs>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
<configuration>
<sourceDirs>$project.build.directory/delombok-test</sourceDirs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
在实现this solution后,我多次修改。
-
我想将我的源代码保留在
src/main/java
而不是src/main/lombok
,所以我在lombok 配置中添加了<sourceDirectory>src/main/java</sourceDirectory>
元素。
添加上述配置导致重复类编译错误,因为编译器正在编译delomboked代码以及src/main/java
中的代码...我只希望它编译delomboked代码...但我也想要IDE忽略delomboked代码......所以我将<addOutputDirectory>false</addOutputDirectory>
添加到lombok插件,并将<sourceDirs>$project.build.directory/delombok-main</sourceDirs>
添加到kotlin插件。
helpful discussion on delomboking code
【讨论】:
这样做可以使构建工作,但在 IntelliJ 中,它会将/src/main/java
完全取消标记为源...并且我必须在每次构建后对其进行注释。你是怎么解决这个问题的?谢谢以上是关于配置 kapt 以处理 lombok 注释的主要内容,如果未能解决你的问题,请参考以下文章