【问题标题】:Configuring kapt to process lombok annotations配置 kapt 以处理 lombok 注释
【发布时间】:2017-10-26 02:09:30
【问题描述】:

这是对这些问题的跟进:

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 仍然被忽略,如相关问题中所述。

有什么可以做的吗?

【问题讨论】:

    标签: kotlin lombok kapt


    【解决方案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后,我多次修改。

    1. 我想将我的源代码保留在src/main/java 而不是src/main/lombok,所以我在lombok 配置中添加了&lt;sourceDirectory&gt;src/main/java&lt;/sourceDirectory&gt; 元素。
    2. 添加上述配置导致重复类编译错误,因为编译器正在编译delomboked代码以及src/main/java中的代码...我只希望它编译delomboked代码...但我也想要IDE忽略delomboked代码......所以我将&lt;addOutputDirectory&gt;false&lt;/addOutputDirectory&gt;添加到lombok插件,并将&lt;sourceDirs&gt;${project.build.directory}/delombok-main&lt;/sourceDirs&gt;添加到kotlin插件。

    helpful discussion on delomboking code

    【讨论】:

    • 这样做可以使构建工作,但在 IntelliJ 中,它会将 /src/main/java 完全取消标记为源...并且我必须在每次构建后对其进行注释。你是怎么解决这个问题的?谢谢
    猜你喜欢
    • 2018-01-17
    • 1970-01-01
    • 2017-03-21
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多